Django: Wie füge ich beliebige HTML-Attribute zu Eingabefeldern in einem Formular hinzu?

Lesezeit: 6 Minuten

Django Wie fuge ich beliebige HTML Attribute zu Eingabefeldern in einem
Nutzer

Ich habe ein Eingabefeld, das mit einer Vorlage wie folgt gerendert wird:

<div class="field">
   {{ form.city }}
</div>

Was gerendert wird als:

<div class="field">
    <input id="id_city" type="text" name="city" maxlength="100" />
</div>

Angenommen, ich möchte ein hinzufügen autocomplete="off" Attribut zum Eingabeelement, das gerendert wird, wie würde ich das machen? Oder onclick="xyz()" oder class="my-special-css-class"?

Überprüfen Sie diese Seite

city = forms.CharField(widget=forms.TextInput(attrs={'autocomplete':'off'}))

  • OK danke. In meinem Fall verwende ich ModelForm, also definiere ich die Formularfelder nicht explizit (z. B. class AddressForm(forms.ModelForm): class Meta: model = models.Address ) Bedeutet dies, dass ich ModelForm nicht verwenden kann oder gibt es etwas Besonderes? tun müssen?

    – Nutzer

    25. Mai ’10 um 5:02 Uhr

  • ok egal, rtfm: docs.djangoproject.com/en/dev/topics/forms/modelforms

    – Nutzer

    25. Mai ’10 um 5:05 Uhr

  • @InfinitelyLoopy in der drin Für das Formular können Sie Code hinzufügen, um das Feld zu erfassen und seine Widget-Attribute zu ändern. Hier sind einige, die ich früher verwendet habe, um 3 Felder zu ändern: “` für field_name in [‘image’, ‘image_small’, ‘image_mobile’]: Feld = self.fields.get(Feldname) field.widget.attrs[‘data-file’] = ‘Datei’ “`

    – Stuart Axon

    6. Juni 14 um 11:59 Uhr


  • Was ist mit Attributen, die keine Argumente wie ‘required’ und ‘autofocus’ annehmen?

    – Wilhelm Klopp

    7. Januar 15 um 17:13 Uhr

  • Diese Lösung ist schlecht, weil es keine Trennung von Anliegen gibt. HTML-Attribute sollten meiner Meinung nach nicht in Python-Code geschrieben werden. Die Lösung von Mikhail Korobov ist überlegen.

    – David D.

    16. Dezember 17 um 15:14 Uhr

1644007927 383 Django Wie fuge ich beliebige HTML Attribute zu Eingabefeldern in einem
Michail Korobow

Entschuldigung für die Werbung, aber ich habe kürzlich eine App veröffentlicht (https://github.com/kmike/django-widget-tweaks), was solche Aufgaben noch weniger schmerzhaft macht, sodass Designer dies tun können, ohne den Python-Code zu berühren:

{% load widget_tweaks %}
...
<div class="field">
   {{ form.city|attr:"autocomplete:off"|add_class:"my_css_class" }}
</div>

oder alternativ,

{% load widget_tweaks %}
...
<div class="field">
   {% render_field form.city autocomplete="off" class+="my_css_class" %}
</div>

  • Schöne App Mike, genau das, wonach ich gesucht habe!

    – jmagnusson

    4. März 11 um 13:17 Uhr

  • Die Dokumentation sagt Ihnen nicht, dass Sie “widget_tweaks” in Ihre installierte App in den Einstellungen einfügen sollen, es könnte sich lohnen, dies in die Dokumentation aufzunehmen.

    – James Lin

    8. November 11 um 19:01 Uhr

  • Hallo James, es ist nicht betont, aber im Abschnitt „Installation“ gibt es bereits einen Hinweis zum Hinzufügen von „widget_tweaks“ zu INSTALLED_APPS.

    – Michail Korobow

    8. November 11 um 23:17 Uhr

  • @MikhailKorobov vielen Dank für diese App, sie hat mir sehr geholfen! Das war genau das Richtige, was ich gesucht habe. Ich brauchte ein Formular von ModelForm und wollte diese Attribute nicht manuell in jedes einzelne Feld (40 davon) einfügen, also habe ich es elegant geschafft, das gleiche Ergebnis in Sekunden zu erzielen 🙂 Dies sollte die akzeptierte Antwort sein!

    – Ljubisa Livac

    28. Januar 16 um 09:04 Uhr


  • Ich hatte vor, eine solche Bewerbung zu schreiben. Danke, dass ich meine Mühe gespart habe.

    – Anuj FSME

    21. September 17 um 7:57 Uhr

Django Wie fuge ich beliebige HTML Attribute zu Eingabefeldern in einem
Künstlich

Wenn Sie “ModelForm” verwenden:

class YourModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(YourModelForm, self).__init__(*args, **kwargs)
        self.fields['city'].widget.attrs.update({
            'autocomplete': 'off'
        })

  • Gut! Sie müssen jetzt nicht alle Widgets explizit definieren.

    – Mikael Lindlöf

    2. Februar 16 um 7:53 Uhr

1644007929 950 Django Wie fuge ich beliebige HTML Attribute zu Eingabefeldern in einem
Wturm

Wenn Sie verwenden ModelForm, abgesehen von der Möglichkeit der Verwendung __init__ Wie @Artificioo in seiner Antwort angegeben hat, gibt es a widgets Wörterbuch in Meta für diese Angelegenheit:

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title', 'birth_date')
        widgets = {
            'name': Textarea(attrs={'cols': 80, 'rows': 20}),
        }

Relevante Dokumentation

Ich wollte keine ganze App für dieses Ding verwenden. Stattdessen habe ich hier folgenden Code gefunden https://blog.joeymasip.com/how-to-add-attributes-to-form-widgets-in-django-templates/

# utils.py
from django.template import Library
register = Library()

@register.filter(name="add_attr")
def add_attr(field, css):
    attrs = {}
    definition = css.split(',')

    for d in definition:
        if ':' not in d:
            attrs['class'] = d
        else:
            key, val = d.split(':')
            attrs[key] = val

    return field.as_widget(attrs=attrs)

Verwenden Sie das Tag in der HTML-Datei

{% load utils %}
{{ form.field_1|add_attr:"class:my_class1 my_class2" }}
{{ form.field_2|add_attr:"class:my_class1 my_class2,autocomplete:off" }}

1644007929 865 Django Wie fuge ich beliebige HTML Attribute zu Eingabefeldern in einem
Alessio

Endgültiges Aussehen und Rendering des FormularsIch habe einige Tage damit verbracht, wiederverwendbare Formularvorlagen zu erstellen, um Modelle in Django-Formularen zu erstellen und zu aktualisieren. Beachten Sie, dass ich ModelForm verwende, um Objekte zu ändern oder zu erstellen. Ich benutze auch Bootstrap, um meine Formulare zu stylen. Ich habe in der Vergangenheit django_form_tweaks für einige Formulare verwendet, aber ich brauchte einige Anpassungen ohne große Vorlagenabhängigkeit. Da ich jQuery bereits in meinem Projekt habe, habe ich mich entschieden, seine Eigenschaften zu nutzen, um meine Formulare zu gestalten. Hier ist der Code und kann mit jedem Formular arbeiten.

#forms.py
from django import forms
from user.models import User, UserProfile
from .models import Task, Transaction

class AddTransactionForm(forms.ModelForm):
    class Meta:
       model = Transaction
       exclude = ['ref_number',]
       required_css_class="required"

Ansichten.py

@method_decorator(login_required, name="dispatch")
class TransactionView(View):
def get(self, *args, **kwargs):
    transactions = Transaction.objects.all()
    form = AddTransactionForm
    template="pages/transaction.html"
    context = {
        'active': 'transaction',
        'transactions': transactions,
        'form': form
    }
    return render(self.request, template, context)

def post(self, *args, **kwargs):
    form = AddTransactionForm(self.request.POST or None)
    if form.is_valid():
        form.save()
        messages.success(self.request, 'New Transaction recorded succesfully')
        return redirect('dashboard:transaction')
    messages.error(self.request, 'Fill the form')
    return redirect('dashboard:transaction')

HTML Quelltext
Hinweis: Ich verwende bootstrap4 modal, um den Aufwand für das Erstellen vieler Ansichten zu beseitigen. Vielleicht ist es besser, generische CreateView oder UpdateView zu verwenden. Bootstrap und jqQery verknüpfen

 <div class="modal-body">
    <form method="post" class="md-form" action="." enctype="multipart/form-data">
      {% csrf_token %}
      {% for field in form %}
      <div class="row">
        <div class="col-md-12">
          <div class="form-group row">
            <label for="" class="col-sm-4 col-form-label {% if field.field.required %}
            required font-weight-bolder text-danger{%endif %}">{{field.label}}</label>
            <div class="col-sm-8">
              {{field}}
            </div>

          </div>
        </div>
      </div>

      {% endfor %}

      <input type="submit" value="Add Transaction" class="btn btn-primary">
    </form>
  </div>

Javascript-Code Denken Sie daran, diese einzuladen $(document).ready(function() { /* ... */}); Funktion.

var $list = $("#django_form :input[type="text"]");
$list.each(function () {
    $(this).addClass('form-control')
  });
  var $select = $("#django_form select");
  $select.each(function () {
    $(this).addClass('custom-select w-90')
  });
  var $list = $("#django_form :input[type="number"]");
  $list.each(function () {
    $(this).addClass('form-control')
  });
  var $list = $("form :input[type="text"]");
  $list.each(function () {
    $(this).addClass('form-control')
  });
  var $select = $("form select");
  $select.each(function () {
    $(this).addClass('custom-select w-90')
  });
  var $list = $("form :input[type="number"]");
  $list.each(function () {
    $(this).addClass('form-control')
  });

.

773960cookie-checkDjango: Wie füge ich beliebige HTML-Attribute zu Eingabefeldern in einem Formular hinzu?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy