2016-08-09 38 views
0

Ich habe ein Modell mit einigen Feldern. Betrachten Sie das folgende Modell.Nur Feldwert von einem Klassenformular in Django anzeigen

class Item(models.Model): 
    a = models.CharField(max_length=200) 
    b = models.BooleanField(default=False) 
    c = models.CharField(max_length=200) 

Eine Formularklasse für das entsprechende Modell.

class ItemForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

    class Meta: 
     model = Item 
     localized_fields = '__all__' 
     fields = [ 
      'a', 
      'b', 
      'c', 
     ] 

Und eine Ansicht für das Formular. Die View-Klasse verwendet eine Vorlage, die alle Felder anzeigt. Aber das Feld c wird nur angezeigt, wenn Feld ist wahr.

{% if form.b.value %} 
    {% form.c %} 
{% endif %} 

Feld c ist nicht editierbare und ich möchte nur den Wert zeigen, die bereits vorab definiert ist.

Das Problem ist, dass, wenn ich einen if Zustand in der Vorlage zu verwenden, (Angenommen b falsch ist), wenn ich das Formular laden Sie es zeigt zwei Felder a und b und wenn ich das Formular mit b Satz auf true einreichen, die Form Reloads ohne Speichern zeigt alle drei Felder mit dem Wert Feld c als leer.

Feld c hat bereits einen Wert und es ist in der DB vorhanden, aber es wird nicht angezeigt. Warum das?

EDIT: Hier ist meine Ansicht, ziemlich einfach

class ItemGeneral(UpdateView): 
    form_class = ItemUpdateForm 
    template_name = 'pretixcontrol/item/index.html' 
    permission = 'can_change_items' 

    @transaction.atomic() 
    def form_valid(self, form): 
     # some code 
     return super().form_valid(form) 
+0

Können Sie versuchen, c read_only zu setzen, anstatt nicht bearbeitet werden? Funktioniert es dann? –

Antwort

1

c un-editierbar zu machen, habe ich die Field.disabled in Django 1.9 neue Attribut verwenden würde. Sehen Sie diesen Beitrag für Informationen darüber, wie es zu benutzen und was zu tun ist, wenn Sie in 1.8 oder älter sind:

In a Django form, how do I make a field readonly (or disabled) so that it cannot be edited?

Was die Spar Frage geht, würde ich Ihre Ansicht zu sehen, um sicher zu sein aber es klingt, als würde bei der Formularvalidierung etwas schief gehen. Ihr Formular erwartet alle drei Felder, da es so initialisiert ist, aber Ihre Vorlage kann ein Feld unabhängig von der Anzeigelogik entfernen. Vielleicht taucht das Problem auf, wenn nur zwei der drei erwarteten Felder form.is_valid() durchlaufen?

Wäre es akzeptabel, dass c immer in der Seitenquelle angezeigt wird? Sie könnten das Formular in allen Fällen normal rendern, dann den Wert des Feldes b mit jQuery/JS und bedingt .hide überprüfen.

Alternativ können Sie Ihr Modell Attribute in der Ansicht überprüfen und bedingt remove a field from the form's self.fields dict oder override the init method.

+0

Dies scheint ein guter Ansatz zu sein, die Verwendung von JS wäre eine gute Möglichkeit, Änderungen auf dem Feld "b" zu hören und dann beide Felder "c" entsprechend dem Wert des Feldes "b" umzuschalten. Mit [form.widgets] (https://docs.djangoproject.com/en/1.10/ref/forms/widgets/#widget) können Sie Feldern Attribute hinzufügen und das Attribut readonly setzen. – kt14

+0

'Field.disabled' hat den Trick gemacht. Ich bin mir nicht sicher, wie ich es vermisst habe. Vielen Dank! :) – JRodDynamite

Verwandte Themen