Frage

Ich verwende einen Django Modelform, in dem mein Modell ein Booleanfield enthält und das Formular -Widget, das mit diesem Booleanfield verbunden ist, ein Radioselect -Widget ist. Ich möchte, dass das Radioselect -Widget, das keine Optionen ausgewählt hat, ausgewählt werden, sodass der Benutzer explizit eine Wahl treffen muss, aber die Formularvalidierung fehlschlägt fehl, wenn er keine Auswahl trifft. Gibt es eine Möglichkeit, dies zu tun?

Models.py

myboolean = models.BooleanField(choices=YES_NO)

forms.py

class myModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(myModelForm, self).__init__(*args, **kwargs)
        self.fields['myboolean'].widget = forms.RadioSelect(choices=YES_NO)
War es hilfreich?

Lösung

Ihr Code macht tatsächlich das, was Sie brauchen. Es rendert die Optionsfelder ohne ausgewählte Optionen und generiert die Fehlermeldung, wenn nichts ausgewählt ist.

Ein kleiner Hinweis zu Ihrem Formularcode. Ich würde es so machen:

class myModelForm(forms.ModelForm):

    myboolean = forms.BooleanField(widget=forms.RadioSelect(choices=YES_NO))

    class Meta:
        model = MyModel

Andere Tipps

Leider ist dies weniger ein Django -Problem als eine HTML -Frage. In der HTML -Spezifikation (RFC1866) heißt es:

Zu jeder Zeit wird genau eine der Optionsfelder in einem Satz überprüft. Wenn keiner deru003CINPUT> Elemente eines Satzes von Optionsfeldern geben "Checked" an, dann muss der Benutzeragent das erste Optionsfeld des Satzes zunächst überprüfen.

Browser haben dies jedoch in der Vergangenheit ignoriert und Optionspunkte auf unterschiedliche Weise implementiert.

HTML macht dies auch schwierig, weil das "geprüfte" Attribut desu003CINPUT> Tag nimmt keinen Parameter an, sodass Sie kein angepasendes Django -Widget verwenden können, das dieses Attribut auf false oder nein festlegt

Eine mögliche Problemumgehung besteht darin, ein kleines JavaScript einzugeben, das als Teil des Onload -Ereignisses des Dokuments ausgeführt wird, bei dem alle Optionsfelder auf der Seite findet und das Attribut "Checked" auf False festgelegt wird (z. B. mit JQuery).

Ich habe ein benutzerdefiniertes Feld mit Standard -Widget erstellt.

Schnitt meiner Modelle.py:

class Order(models.Model):
    ...
    # transport =  models.CharField(choices=transport.choices,max_length=25,null=True)
    transport = SelectField(choices=transport.choices,max_length=25,null=True)
    ...

Felddefinition:

from django.db import models
from django.forms import widgets

class SelectField(models.CharField):
    def formfield(self, **kwargs):
        if self._choices:
            defaults = {'widget': widgets.RadioSelect}
        defaults.update(kwargs)
        return super(SelectField, self).formfield(**defaults)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top