2010-08-23 4 views
2

Maintenant, je peux créer tous les champs db nécessaires dans mes modèles.Formulaire, modèle, formulaire

Je peux créer des formulaires pour accéder à ces modèles.

Et si je crée des formes à partir de modèles:

http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

Je ne peux pas comprendre, pourquoi je dois redéfinir les champs comme ceux-ci:

class AuthorForm(forms.Form): 
    name = forms.CharField(max_length=100) 
    title = forms.CharField(max_length=3, 
       widget=forms.Select(choices=TITLE_CHOICES)) 
    birth_date = forms.DateField(required=False) 

Pourquoi dois-je définir CharField ici ? Ne l'ai-je pas déjà fait dans le fichier models.py?

Merci beaucoup.

+0

-1 pour ne pas lire la page de document à laquelle vous êtes réellement lié. –

Répondre

3

bâtiment sur ce gruszczy said si vous avez un modèle nommé Author vous pouvez déclarer une ModelForm pour ce modèle ainsi:

class AuthorForm(forms.ModelForm): # Note the different superclass. 
    class Meta: 
     model = Author 

Si vous voulez un formulaire qui inclut tous attributs de Author alors c'est tout Tu as besoin de faire. Si toutefois vous avez seulement besoin d'un sous-ensemble d'attributs de Author (par exemple name et title), vous pouvez modifier le modèle de formulaire ainsi:

class AuthorForm(forms.ModelForm): # Note the different superclass. 
    class Meta: 
     model = Author 
     fields = ('name', 'title',) 

Notez que vous ne devez pas utiliser CharField ici.

Si d'autre part vous voulez tout saufname et title, vous pouvez définir votre formulaire comme ceci:

class AuthorForm(forms.ModelForm): # Note the different superclass. 
    class Meta: 
     model = Author 
     exclude = ('name', 'title',) 

Mise à jour

(Après avoir lu un commentaire) Vous pouvez traiter AuthorForm comme any other regular form. À votre avis, vous pouvez instancier ce formulaire avec ou sans données basées sur le request.method. Quelque chose comme ceci:

def add_author(request, *args, **kwargs): 
    if request.method == 'GET': 
     form = AuthorForm() 

    elif request.method == 'POST': 
     form = AuthorForm(request.POST.copy()) 
     if form.is_valid(): 
      author = form.save() 
      # Redirect to listing etc. 

    context = dict(form = form) 
    return render_to_response(template_name, context) # etc. 

Et dans votre modèle:

{{ form.as_p }} 

Il y a different ways de rendre une forme; as_p n'en est qu'une.

+0

+1 pour une explication claire et concise! – KillianDS

+0

Merci! Et comment j'insérerais ce formulaire "Auteur" dans le code html? Merci encore, tout est perspicace! – MacPython

+0

@MacPython: cette forme peut être traitée comme n'importe quelle autre 'Form'. Vous pouvez instancier ce formulaire à partir de la vue (avec ou sans données en fonction de la méthode de requête) et le transmettre au modèle. Dans votre modèle, vous pouvez afficher le formulaire en utilisant l'une des méthodes utilitaires.J'ai mis à jour mon message pour le démontrer. –

1

Vous utilisez forms.Form plutôt que forms.ModelForm et déclarez le modèle que vous utilisez (dans class Meta). Peut-être que c'est le problème. Pourriez-vous décrire, pour quel modèle de vous avez le problème?

Questions connexes