2016-07-27 7 views
1

Ich bin ein Formular in Django basierend auf meinen Modellen erstellen. Ich habe dies in meinem views.py:Wie Formularaktion in Django funktioniert, wenn eine Klasse in views.py für die Formularerstellung verwendet

class GroupCreateView(CreateView): 
    model = Group 
    form_class = GroupForm 
    template_name = 'ipaswdb/group/group_form.html' 

die Vorlage mit einigen netten Form CSS gut aussieht und ein Datepicker und dergleichen. Ich habe auch eine Form, damit ich Widgets in meinem forms.py hinzufügen

class GroupForm(forms.ModelForm): 
    notes=forms.CharField(widget = forms.Textarea) 
    billing_address = forms.ModelChoiceField(queryset=Address.objects.all(), widget=forms.Select(attrs={'tabindex':'5'})) 
    start_date = forms.DateField(widget=forms.TextInput(attrs= 
           { 
            'class':'datepicker', 
            'tabindex' : '5', 
            'placeholder' : 'Groups start date' 
           })) 

    class Meta: 
     model=Group 
     exclude = ['created_at', 'updated_at'] 

All dies macht Sinn für mich, kann ich sehen, wie die Form mein Modell aufgebaut ist, basiert weg und wird mit den Dingen bevölkert sagen im ModelChoiceField etc .. Ich bin mir einfach nicht sicher, wie das def some_method in meinem views.py ins Spiel kommt. Also in meiner Formularvorlage für die Formularaktion habe ich folgendes:

<h1> Add a new Group </h1> 
    <form action="." method="post"> 
    {% csrf_token %} 
    <div class="col-2"> 
    {{ form.group_name.errors }} 
    <label> 
     Group Name: 
     <input placeholder="Enter the groups name" id="id_group_name" name="group_name" tabindex="1"> 
    </label> 
    </div> 
    <div class="col-2"> 
     {{ form.group_contact.errors }} 

    <label> 
     Gorup Contact 
     <input placeholder="Enter the groups contact name" id="id_group_contact" name="group_contact" tabindex="2"> 
    </label> 
    </div> 

    <div class="col-2"> 
    {{ form.tin.errors }} 
    <label> 
     TIN Number 
     <input placeholder="Groups TIN#" id="id_tin" name="tin" tabindex="3"> 
    </label> 
    </div> 
    <div class="col-2"> 
    {{ form.npi.errors }} 
    <label> 
     NPI Number 
     <input placeholder="Groups NPI#" id="id_npi" name="npi" tabindex="4"> 
    </label> 
    etc etc etc 

Was ich denke, ruft einige Standardmethode in der Ansicht auf? Ich bin mir nur nicht sicher, was diese Methode ist. Dies ist auch für das Hinzufügen einer neuen Gruppe, ich vermute, brauche ich eine andere Ansicht oder etwas, um den Fall zu behandeln, wo sie eine bereits bestehende Gruppe bearbeiten? Diese Blog-Demo, die ich verwendet habe, hat alles in der sessions.py mit einem forms.py gemacht und dachte auch, dass es keine Klasse GroupCreateView (CreateView) gab: Esque-Methode in dem Beispiel, in dem ich in der views.py arbeitete, gab es das Verfahren (Beachten sie meine Methode nicht):

def post_detail(request, year, month, day, post): 
    post = get_object_or_404(Post, slug=post, 
          status='published', 
          publish__year=year, 
          publish__month=month, 
          publish__day=day) 

    comments = post.comments.filter(active=True) 
    #their form stuff 
    if request.method == 'POST': 
     comment_form = CommentForm(data=request.POST) 
     if comment_form.is_valid(): 
      new_comment = comment_form.save(commit=False) 
      new_comment.post = post 
      new_comment.save() 
    else: 
      comment_form=CommentForm() 

    return render(request, 
        'blog/post/detail.html', 
        {'post': post, 'comments':comments, 'comment_form':comment_form}) 

Meine Frage ist (und ich kann mich nicht erinnern, was es beispielsweise zu zitieren), aber was ist das class GroupCreateView(CreateView): wirklich tun und wie kann ich das Formular erhalten sie referenziert/zurück zu kommen, schafft um die richtige Aktion zu nennen, die mich schließlich validieren und in der Datenbank speichern lässt?

Auch eine zweite Art von Teil ist, wie könnte ich das (grob) erweitern, um den Fall zu behandeln, wo es eine neue Gruppe hinzufügt, und vielleicht auch einen anderen Fall, wo es einen bestehenden bearbeitet? (Ich stelle diese zweite Frage hier, weil ich sicher bin, dass es sich auf die Antwort von Anfang an bezieht).

Aus meiner urls.py

url(r'group/add/$', GroupCreateView.as_view(), name='group-add'), 
+0

Die Formularaktion hat nichts mit Django zu tun, es ist nur die URL, die das Formular übermittelt. '". "' ist eine Abkürzung, die "den aktuellen Pfad" bedeutet. –

+0

Okay, also bedeutet das, dass ich eine Anweisung in meinem urls.py benötige, um anzugeben, welche Methode damit umgehen wird? – Codejoy

+0

Nun ja, aber der Punkt ist, es ist die gleiche URL, die das Formular anzeigt und verarbeitet. –

Antwort

1

Dont Angst django Quellcode zu lesen: P, die generische Klasse hat zwei Methoden: "get" und "post" (und "put" auch, aber es ruft "post" auf, Sie können sie bei Bedarf überschreiben.

class BaseCreateView(ModelFormMixin, ProcessFormView): 
    """ 
    Base view for creating an new object instance. 

    Using this base class requires subclassing to provide a response mixin. 
    """ 
    def get(self, request, *args, **kwargs): 
     self.object = None 
     return super(BaseCreateView, self).get(request, *args, **kwargs) 

    def post(self, request, *args, **kwargs): 
     self.object = None 
     return super(BaseCreateView, self).post(request, *args, **kwargs) 

aber es erbt auch die Methoden seiner Eltern so könnte es ein wenig schwer zu lesen sein. Ich überprüfe immer die docs for the generic views, es gibt Ihnen eine Liste aller Methoden, die Sie für jede generische Klasse überschreiben können. Jetzt können Sie alle Methoden überschreiben Sie wollen, ohne Code zu wiederholen (das ist, warum ich < 3 CBV)

ich in Ihrem Fall könnte man denken, die form_valid() Methode überschrieben werden soll, etwas zu tun, bevor zum Erfolg Seite umleitet

Hoffe, das hilft

+2

Im Allgemeinen sollten Sie das Überschreiben von "get" und "post" vermeiden. Es gibt fast immer spezifischere Methoden - wie form_valid, wie Sie bereits erwähnt haben. –

+0

Ich habe versucht, eine success_url einzuschließen, und beim Senden passiert nichts. Ich denke, dass meine Form irgendwie lautlos versagt? In einer seltsamen Wendung sind die Fehler jedoch korrekt. Wenn ich es leer lasse sagt blank error, wenn ich einem schlechten Date ein schlechtes Datum gebe. Ich wette, ich habe nicht die Form.Field.Ferrors auf alles, was mein Modell denkt, sollte vorhanden sein und es verursacht schlechte UI-Feedback. Überprüfen Sie dies. – Codejoy

+1

Danke Jungs, es hat alles funktioniert. Ich versuche jetzt ein UpdateView-Modell, es füllt automatisch die Felder aus, was großartig ist. Solange ich den {{form.group_name}} anstelle des direkten HTML-Ansatzes verwende: Ich bin obwohl ich jetzt alles umstellen kann, um diese Funktionalität zurück zu bekommen. – Codejoy

Verwandte Themen