2016-07-02 4 views
1

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 
+0

Warum das Feld nicht nur lesbar, anstatt deaktiviert machen? – rnevius

+0

Könnten Sie sich den Abschnitt "Später hinzugefügt" in der Frage ansehen. Ich habe es ohne Erfolg versucht. – Michael

+0

Mögliches Duplikat von [HTML-Formular readonly SELECT-Tag/Eingabe] (http://stackoverflow.com/questions/368813/html-form-readonly-select-tag-input) – rnevius

Antwort

0
def get_form(self, form_class): 
    """ 
    For one-to-many relationships. 
    Deprive user of any choice. 
    """ 
    form = super(CreateSubordinate, self).get_form(form_class) 
    one = self.initial.get('one') 
    if one: 
     choices = ((one.id, one),) 
     form.fields['one'].widget = forms.Select(choices=choices) 
    return form 
1

disabled Eingangswerte werden nicht mit dem Formular eingereicht.Von MDN:

deaktiviert

Dieses Boolesche Attribut gibt an, dass die Formsteuerung für die Interaktion nicht verfügbar ist. Insbesondere wird das Klickereignis bei deaktivierten Steuerelementen nicht ausgelöst. Außerdem wird ein deaktivierter Wert des Steuerelements nicht mit dem Formular übermittelt.

Stattdessen sollten Sie berücksichtigen readonly mit:

Nur-Lese-

Dieses Boolesche Attribut gibt an, dass der Benutzer den Wert des Steuer ändern können.

value = value.replace('name="one"', 'name="one" readonly') 
+0

Leider hat das nicht geholfen. Bitte, siehe "Später hinzugefügt" Abschnitt in der Frage. – Michael

Verwandte Themen