【问题标题】:Using current user to initialize ForeignKey user in Django CreateView使用当前用户在 Django CreateView 中初始化 ForeignKey 用户
【发布时间】:2015-08-27 06:18:13
【问题描述】:

我收到一个错误:

AttributeError at /courses/create/
'CourseStudentForm' object has no attribute 'user'

当我尝试通过将用户字段设置为当前用户来创建新对象时:

class CourseStudentCreate(CreateView):
    model = CourseStudent
    fields = ['semester', 'block', 'course', 'grade']
    success_url = reverse_lazy('quests:quests')

    @method_decorator(login_required)
    def form_valid(self, form):
        data = form.save(commit=False)
        data.user = self.request.user
        data.save()
        return super(CourseStudentCreate, self).form_valid(form)

这是模型:

class CourseStudent(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    semester = models.ForeignKey(Semester)
    block = models.ForeignKey(Block)
    course = models.ForeignKey(Course)
    grade = models.PositiveIntegerField()
    active = models.BooleanField(default=True)

表单显示正确,但提交时出现错误。

回答:

从这里: Pass current user to initial for CreateView in Django

如果我想将用户保留为必填字段,如果我将form_valid 更改为:

def form_valid(self, form):
    form.instance.user = self.request.user
    return super(CourseStudentCreate, self).form_valid(form)

Burhan Khalid 在下面描述了错误的原因。

【问题讨论】:

    标签: python django django-views django-class-based-views


    【解决方案1】:

    它不起作用的原因是您的表单类中缺少必填字段;回想一下模型表单验证也将validate the model instance

    验证ModelForm

    验证ModelForm 涉及两个主要步骤:

    Validating the form
    Validating the model instance
    

    在您的类中,继承的post 方法正在调用is_valid()

    def post(self, request, *args, **kwargs):
        """
        Handles POST requests, instantiating a form instance with the passed
        POST variables and then checked for validity.
        """
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)
    

    你可以看到它只有在is_valid()返回true时才调用form_valid();在您的情况下,它无法返回 true,因为您缺少必需的属性。

    您可以通过在模型中将user 外键设为可选来轻松解决此问题。

    【讨论】:

    • 谢谢。那么,如果我想将用户保留为必填字段,那么我应该在该字段上设置blank=True
    • 或者,如果我创建class CourseStudentForm(forms.ModelForm):,我可以在那里初始化用户值吗?
    • 不是blank=True,需要设置null=True(否则数据库验证会失败)。
    • 但我想根据需要保留该字段。我找到它并编辑了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2020-07-08
    • 1970-01-01
    • 2018-02-08
    • 2011-08-11
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多