Django ist 1.9.7deaktiviert Attribut gerendert html hinzugefügt, und jetzt bilden nicht gültig
class PlaceName(models.Model):
one = ForeignKey(Place, on_delete=models.CASCADE)
...
class PlaceNameCreate(CreateView):
model = PlaceName
fields = ['one', 'name', 'since', ]
@register.filter
def disable_one(value):
"""
Disable selection of "one" field in case of one-to-many relations.
"""
value = value.replace('name="one"', 'name="one" disabled')
value = mark_safe(value)
return value
<form method="post" action="">
{% csrf_token %}
<table>
{{ form.as_table|disable_one }}
</table>
<input type="submit" value="Сохранить"/>
</form>
Dieser Placename ist ein nachgeordnete Nachschlagewerk, ist wichtigste Platz. Von PlaceView (DetailView) rufe ich PlaceNameCreate auf, übertrage einen vorzeichenbehafteten Wert von Place und möchte Benutzern nicht erlauben, diesen zu ändern.
Nun, das funktioniert nicht. Auf der Seite für diesen ForeignKey gibt es eine Nachricht "Dieses Feld ist erforderlich".
Wenn ich den disable_one Filter aus der Vorlage entfernen, funktioniert alles: speichert die Modellinstanz erfolgreich.
Wenn ich FormMixin und es in dem Verfahren get_form graben kann ich sehen, dass
dict: {'instance': None, 'data': <QueryDict: {'since': ['2'], 'csrfmiddlewaretoken': ['6NPIva2Z7XEZzuG2xgWB3sAz0N1SPqZc'], 'name': ['2']}>, 'files': <MultiValueDict: {}>, 'prefix': None, 'initial': {}}
Das bedeutet, dass ein Feld leer ist. Nicht überraschend, dass das Formular nicht gültig ist.
Ohne Filter:
dict: {'instance': None, 'data': <QueryDict: {'one': ['3'], 'since': ['3'], 'csrfmiddlewaretoken': ['6NPIva2Z7XEZzuG2xgWB3sAz0N1SPqZc'], 'name': ['2']}>, 'files': <MultiValueDict: {}>, 'prefix': None, 'initial': {}}
überprüfte ich die gerenderte HTML. Der einzige Unterschied ist - wie erwartet - das Attribut "deaktiviert".
Jede Variante wäre akzeptabel, mein Weg mit dem Filter ist kein Dogma. Ich dachte nur, dass es die einfachste ist.
Können Sie mir einen Hinweis geben, wie ich mein aktuelles Ziel erreichen kann: Der Wert sollte dem Benutzer angezeigt werden, während die Auswahl anderer Varianten unmöglich ist.
später hinzugefügt:
Ich versuchte nur lesbar, wie vorgeschlagen. Funktioniert nicht. Dies ist das gerenderte HTML.
<!DOCTYPE html>
...
<select id="id_one" name="one" readonly>
<option value="">---------</option>
<option value="3" selected="selected">664011</option>
</select>
Nun, in den Browser ein Benutzer immer noch zwischen zwei Werten ("---------" und "664011".
Added wieder
Diese wählen können Frage wurde als Duplikat betrachtet. Aber das ist nicht. Dies ist eine reine Django Frage. Was für mich als eine Lösung vorgeschlagen wurde, war wie folgt: disable-Element, aber den Wert in einer versteckten Eingabe. Dann verwenden Sie JQuery. Das ist nicht was ich gerne machen würde
Mögliche Lösung
Ich habe mich gerade dafür entschieden, dem Benutzer jede andere Wahl zu entziehen. Wenn es keine bessere Lösung gibt, ist das akzeptabel.
def get_form(self, form_class):
form = super(PlaceNameCreate, self).get_form(form_class)
one = self.initial.get('one')
choices = ((one.id, one),)
form.fields['one'].widget = forms.Select(choices=choices)
return form
Warum das Feld nicht nur lesbar, anstatt deaktiviert machen? – rnevius
Könnten Sie sich den Abschnitt "Später hinzugefügt" in der Frage ansehen. Ich habe es ohne Erfolg versucht. – Michael
Mögliches Duplikat von [HTML-Formular readonly SELECT-Tag/Eingabe] (http://stackoverflow.com/questions/368813/html-form-readonly-select-tag-input) – rnevius