2017-02-14 3 views
2

Ich bin interessiert, gibt es eine Möglichkeit, Wiederholungen zwischen Django ModelForm und Django Model zu vermeiden. Zum Beispiel Ich habe dieses einfachste Modell:Vermeiden Sie Wiederholung zwischen Django ModelForm und Django Modell

class Category(models.Model): 
    name = models.CharField(max_length=128) 

und entsprechende Modelform, um es

class CategoryForm(forms.ModelForm): 
    name = models.CharField(max_length=128) 
    class Meta: 
     model = Category 
     fields = ('name',) 

Wie wir sich Wiederholung zwischen diesen Einheiten sehen. Dieser Code

max_length=128 

- verletzt es das Prinzip "Do not repeat yourself"?
Und wenn es verletzt, wie können wir diese Doppelung des Codes vermeiden?

+1

Die zweite Klasse wird von 'Model' anstelle von' ModelForm' übernommen, ist das ein Tippfehler? Außerdem müssen Sie die Felder in 'ModelForm' nicht explizit definieren. – yedpodtrzitko

+0

Ja, es ist ein Tippfehler. Ich habe es behoben. Entschuldigung. Nun sollte es in Ordnung sein. –

Antwort

0

Wie in der anderen Antwort darauf hingewiesen, Sie müssen nicht erneut die Felder in der Modelform zu erklären. Sie müssen sie nur im Attribut fields der Klasse Meta auflisten. Wenn du das Gefühl hast, dass es nicht DRY genug ist. Sie können __all__

Stellen Sie die Felder Attribut auf den besonderen Wert ‚alle‘ verwenden, um anzuzeigen , dass alle Felder in dem Modell verwendet werden soll. Zum Beispiel:

Ref: https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/

1

Aber Sie müssen name Feld in Form noch einmal in Ihrem Fall angeben.

Sie verwenden ModelForm, also in Meta nur definieren, das auf dieses Formular und Felder verwiesen wird, die in Form verwendet werden sollten. Django wird Widgets holen und Formulare für Sie erstellen.

Damit genug

class CategoryForm(forms.ModelForm): 
    class Meta: 
     model = Category 
     fields = ('name',) 
0

--model

class Category(models.Model): 
    name = models.CharField(max_length=128) 

-Form

class CategoryForm(forms.ModelForm): 
    class Meta: 
    model = Category 
    fields = ('name',) 

-Ansicht

class CategoryView(request): 
    form = CategoryForm() 
    if request.method == "POST": 
     #code.. 
     return render(request,'htmlpage.html',{Variables: Variables}) 
    else: 
     return render(request, "htmlpage.html",{'form':form}) 

'Formular' erstellt, Seite wird geladen. Hier wird die Anfrage von der HTML-Seite mit POST abgefragt. Wenn der Post nicht angefordert wird, wird die FORM-Vorlage an die HTML-Seite gesendet.