2017-02-14 2 views
2

Je suis intéressé est-il un moyen d'éviter la répétition entre Django ModelForm et Django Model. E.g. J'ai ce modèle le plus simple:Évitez la répétition entre Django ModelForm et Django Modèle

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

et ModelForm lui correspondant

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

Comme on peut le voir il y a répétition entre ces entités. Ce code

max_length=128 

- est-ce que cela va à l'encontre du principe "Ne vous répétez pas"?
Et si cela viole, comment pouvons-nous éviter cette duplication de code?

+1

La deuxième classe est héritée de 'Model' au lieu de' ModelForm', est-ce une faute de frappe? Alsoyou n'avez pas à définir explicitement les champs dans 'ModelForm'. – yedpodtrzitko

+0

Oui, c'est un typo.J'ai réparé.Excuse-moi.Maintenant, il devrait être OK. –

Répondre

0

Comme indiqué dans l'autre réponse, vous n'avez pas besoin de re déclarer les champs de la ModelForm. Vous avez seulement besoin de les lister dans l'attribut fields de la classe Meta. Si vous pensez que ce n'est pas assez sec. Vous pouvez utiliser __all__

Définissez les champs attribuent à la valeur spéciale « tous » pour indiquer qui doit être utilisé tous les champs du modèle. Par exemple:

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

1

Mais vous n'avez pas besoin de spécifier le champ name dans le formulaire une fois de plus dans votre cas.

Vous utilisez ModelForm, donc dans Meta il suffit de définir le modèle, qui se réfère à ce formulaire et les champs, qui devraient être utilisés dans le formulaire. Django récupérera les widgets et construira le formulaire pour vous.

Alors c'est assez

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

--model

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

-Forme

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

-Vue

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}) 

Création de 'formulaire', affichage des charges de page. Ici, la requête de la page html est interrogée avec POST. Si le message n'est pas demandé, le modèle FORM est envoyé à la page html.