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"?
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?
@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
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:
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.
Gut! Sie müssen jetzt nicht alle Widgets explizit definieren.
– Mikael Lindlöf
2. Februar 16 um 7:53 Uhr
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}),
}
# 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)
Ich 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