Django, save ModelForm

前端 未结 2 1950
慢半拍i
慢半拍i 2020-12-13 02:51

I have created a model Student which extends from the Django User and is a foreign key to another model while it has an integer field calle

相关标签:
2条回答
  • 2020-12-13 03:05

    You dont need to redefine fields in the ModelForm if you've already mentioned them in the fields attribute. So your form should look like this -

    class SelectCourseYear(forms.ModelForm):
        class Meta:
            model = Student
            fields = ['course', 'year'] # removing user. we'll handle that in view
    

    And we can handle the form with ease in the view -

    def step3(request):
        user = request.user
        if request.method == 'POST':
            form = SelectCourseYear(request.POST)
            if form.is_valid():
                student = form.save(commit=False)
                # commit=False tells Django that "Don't send this to database yet.
                # I have more things I want to do with it."
    
                student.user = request.user # Set the user object here
                student.save() # Now you can send it to DB
    
                return render_to_response("registration/complete.html", RequestContext(request))
        else:
            form = SelectCourseYear()
        return render(request, 'registration/step3.html',)
    
    0 讨论(0)
  • 2020-12-13 03:06

    course has to be an instance of a Course model, not just the primary key of the instance. You can still accept an id in the form as a text input, but you're going to need to retrieve the actual course instance and assign the value.

    You'll need to verify that the course id is valid, so putting that code into the clean method isn't a bad idea. Notice also how the course field is excluded here? Otherwise the form will expect it to be present. You also don't need to re-define the year field, as the ModelForm will inherit that field from the Student model.

    # forms.py
    
    class SelectCourseYear(forms.ModelForm):
        class Meta:
            model = Student
            exclude = ['user', 'course']
    
        course_id = forms.IntegerField()
    
        def __init__(self, *args, **kwargs):
            self.user = kwargs.pop('user')
            super(SelectCourseYear, self).__init__(*args, **kwargs)
    
        def clean_course_id(self):
            course_id = self.cleaned_data.get('course_id')
            try:
                self.course = Course.objects.get(pk=course_id)
            except Course.DoesNotExist:
                raise forms.ValidationError('Sorry, that course id is not valid.')
    
            return course_id
    
        def save(self, commit=True):
            instance = super(SelectCourseYear, self).save(commit=False)
            instance.course = self.course
            instance.user = self.user
            if commit:
                instance.save()
            return instance
    
    
    # views.py
    
    def step3(request):
        if request.method == 'POST':
            form = SelectCourseYear(request.POST or None, user=request.user)
            if form.is_valid():
                form.save()
                return render_to_response("registration/complete.html",
                    RequestContext(request))
        return render(request, 'registration/step3.html',)
    

    Now, when you call .save() on the model, the course field will be assigned an instance of Course

    0 讨论(0)
提交回复
热议问题