Django 在formest中为窗体设置FK

Django 在formest中为窗体设置FK,django,django-crispy-forms,Django,Django Crispy Forms,我试图为提交的表单设置FK,但它却在抱怨我!哦,天哪 这就是我在提交表单时遇到的错误 完整性错误/构建教室/ 报告\u教室。用户\u id不能为空 我认为它与ClassroomForm中的exclude=(“user”)有关,或者它可能与我的视图codeschool.user=request.user有关 forms.py class ClassroomForm(forms.ModelForm): class Meta: model = Classroom

我试图为提交的表单设置FK,但它却在抱怨我!哦,天哪

这就是我在提交表单时遇到的错误

完整性错误/构建教室/ 报告\u教室。用户\u id不能为空

我认为它与ClassroomForm中的
exclude=(“user”)
有关,或者它可能与我的视图code
school.user=request.user有关

forms.py

class ClassroomForm(forms.ModelForm):
    class Meta:
        model = Classroom
        exclude = ("user",)
    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_method = 'post'
        self.helper.form_action = ''
        self.helper.form_tag = False
        self.helper.layout = Layout(
            Fieldset('Create a New Classroom','name'),
            )

        super(ClassroomForm, self).__init__(*args, **kwargs)

class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        exclude = ("classroom",)
    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_method = 'post'
        self.helper.form_action = ''
        self.helper.form_tag = False
        self.helper.layout = Layout(
            Fieldset(
                'Add Student',
                Div('first_name', css_class="large-5 columns"),
                Div('last_name', css_class="large-5 columns"),
                Div('birth_date', css_class="large-2 columns"),
                Div('gender', css_class="large-2 columns"),
                Div('ethnicity', css_class="large-2 columns"),
                Div('race', css_class="large-2 columns"),
                Div('free_or_reduced_lunch','prior_special_ed_services', css_class="large-6 columns"),
            ),
            )
        super(StudentForm, self).__init__(*args, **kwargs)
@login_required
def build_classroom(request):
    # Empty formset forms should be required
    class RequiredFormSet(BaseFormSet):
        def __init__(self, *args, **kwargs):
            super(RequiredFormSet, self).__init__(*args, **kwargs)
            for form in self.forms:
                form.empty_permitted = False
    StudentFormSet = formset_factory(StudentForm, max_num=100, formset=RequiredFormSet)
    if request.method == 'POST': # If the form has been submitted...
        classroom_form = ClassroomForm(request.POST) # A form bound to the POST data
        # Create a formset from the submitted data
        student_formset = StudentFormSet(request.POST, request.FILES)

        if classroom_form.is_valid() and student_formset.is_valid():
            classroom = classroom_form.save(commit=False)
            classroom.user = request.user
            for form in student_formset.forms:
                student = form.save(commit=False)
                student.classroom = classroom
                student.save()
            return HttpResponseRedirect('/') # Redirect to a 'success' page
    else:
        classroom_form = ClassroomForm()
        student_formset = StudentFormSet()

    # For CSRF protection
    # See http://docs.djangoproject.com/en/dev/ref/contrib/csrf/ 
    c = {'classroom_form': classroom_form,
         'student_formset': student_formset,
        }
    c.update(csrf(request))

    return render_to_response('reports/build_classroom.html', c)
class Classroom(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=30)
    added = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __unicode__ (self):
        return self.name
视图.py

class ClassroomForm(forms.ModelForm):
    class Meta:
        model = Classroom
        exclude = ("user",)
    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_method = 'post'
        self.helper.form_action = ''
        self.helper.form_tag = False
        self.helper.layout = Layout(
            Fieldset('Create a New Classroom','name'),
            )

        super(ClassroomForm, self).__init__(*args, **kwargs)

class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        exclude = ("classroom",)
    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_method = 'post'
        self.helper.form_action = ''
        self.helper.form_tag = False
        self.helper.layout = Layout(
            Fieldset(
                'Add Student',
                Div('first_name', css_class="large-5 columns"),
                Div('last_name', css_class="large-5 columns"),
                Div('birth_date', css_class="large-2 columns"),
                Div('gender', css_class="large-2 columns"),
                Div('ethnicity', css_class="large-2 columns"),
                Div('race', css_class="large-2 columns"),
                Div('free_or_reduced_lunch','prior_special_ed_services', css_class="large-6 columns"),
            ),
            )
        super(StudentForm, self).__init__(*args, **kwargs)
@login_required
def build_classroom(request):
    # Empty formset forms should be required
    class RequiredFormSet(BaseFormSet):
        def __init__(self, *args, **kwargs):
            super(RequiredFormSet, self).__init__(*args, **kwargs)
            for form in self.forms:
                form.empty_permitted = False
    StudentFormSet = formset_factory(StudentForm, max_num=100, formset=RequiredFormSet)
    if request.method == 'POST': # If the form has been submitted...
        classroom_form = ClassroomForm(request.POST) # A form bound to the POST data
        # Create a formset from the submitted data
        student_formset = StudentFormSet(request.POST, request.FILES)

        if classroom_form.is_valid() and student_formset.is_valid():
            classroom = classroom_form.save(commit=False)
            classroom.user = request.user
            for form in student_formset.forms:
                student = form.save(commit=False)
                student.classroom = classroom
                student.save()
            return HttpResponseRedirect('/') # Redirect to a 'success' page
    else:
        classroom_form = ClassroomForm()
        student_formset = StudentFormSet()

    # For CSRF protection
    # See http://docs.djangoproject.com/en/dev/ref/contrib/csrf/ 
    c = {'classroom_form': classroom_form,
         'student_formset': student_formset,
        }
    c.update(csrf(request))

    return render_to_response('reports/build_classroom.html', c)
class Classroom(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=30)
    added = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __unicode__ (self):
        return self.name
构建教室.html

<form action="" method="POST">{% csrf_token %}
    <div class="section">
        {% crispy classroom_form %}
    </div>
    {{ student_formset.management_form|crispy }}
    {% for form in student_formset.forms %}
    <div class="item">
      {% crispy form %}
      <p style=""><a class="delete button secondary" href="#">Delete</a></p>
    </div>
    {% endfor %}
    <a id="add" class='button' href="#">Add another student</a>
    <input type="submit" value="Submit" class='button' />
</form>

我遗漏了一些jQuery和其他代码。

看起来
user
是models.py中所必需的。尝试检查它。这不是表单。检查它是否有效?我不确定,因为您已将此字段从表单中排除。我想我的问题在于:
chourse=chourse\u form.save(commit=False)chourse.user=request.user for form in student\u formset.forms:student=form.save(commit=False)student.教室=教室student.save()