Django Forms Newbie Question

前端 未结 2 1730
花落未央
花落未央 2021-02-03 15:47

Alright, I\'m at a loss with the Django Forms, as the documentation just doesn\'t seem to quite cover what I\'m looking for. At least it seems to come to a screeching halt once

相关标签:
2条回答
  • 2021-02-03 16:24

    First, you create a ModelForm for a given Model. In this example I'm doing it for Quiz but you can rinse and repeat for your other models. For giggles, I'm making the "label" be a Select box with preset choices:

    from django.models import BaseModel
    from django import forms
    from django.forms import ModelForm
    
    CHOICES_LABEL = (
        ('label1', 'Label One'),
        ('label2', 'Label Two')
    
    )
    
    class Quiz(models.Model):
        label = models.CharField(blank=True, max_length=400)
        slug = models.SlugField()
    
        def __unicode__(self):
            return self.label
    
    class QuizForm(ModelForm):
        # Change the 'label' widget to a select box.
        label = forms.CharField(widget=forms.Select(choices=CHOICES_LABEL))
    
        class Meta:
           # This tells django to get attributes from the Quiz model
           model=Quiz
    

    Next, in your views.py you might have something like this:

    from django.shortcuts import render_to_response
    from forms import *
    import my_quiz_model
    
    def displayQuizForm(request, *args, **kwargs):
       if request.method == 'GET':
           # Create an empty Quiz object. 
           # Alternately you can run a query to edit an existing object.
    
           quiz = Quiz()
           form = QuizForm(instance=Quiz)
           # Render the template and pass the form object along to it.
           return render_to_response('form_template.html',{'form': form})
    
       elif request.method == 'POST' and request.POST.get('action') == 'Save':
           form = Quiz(request.POST, instance=account)
           form.save()
           return HttpResponseRedirect("http://example.com/myapp/confirmsave")
    

    Finally your template would look like this:

    <html>
      <title>My Quiz Form</title>
      <body>
    
      <form id="form" method="post" action=".">
    
       <ul>
        {{ form.as_ul }}
       </ul>
    
       <input type="submit" name="action" value="Save">
       <input type="submit" name="action" value="Cancel">
      </form>
    
      </body>
    </html>
    
    0 讨论(0)
  • 2021-02-03 16:29

    Yeah I have to agree the documentation and examples are really lacking here. The is no out of the box solution for the case you are describing because it goes three layers deep: quiz->question->answer.

    Django has model inline formsets which solve the problem for two layers deep. What you will need to do to generate the form you want is:

    1. Load up a quiz form (just a label text box from your model)
    2. Load a an question formset: QuestionFormSet(queryset=Question.objects.filter(quiz=quiz))
    3. For each question load up a answer formset in much the same way you load up the question formset
    4. Make sure you save everything in the right order: quiz->question->answer, since each lower level needs the foreign key of the item above it
    0 讨论(0)
提交回复
热议问题