Django表单的默认值

时间:2013-08-23 13:21:08

标签: python django

我有以下型号:

class Question(models.Model):
    section = models.ForeignKey(Section)
    description = models.TextField()
    answer = models.TextField(blank=True, null=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL)

相应的表格是

class QuestionForm(forms.ModelForm):
    class Meta:
        model = Question
        fields = ('description', 'section', 'author')

我的问题是如何传递给作者的表格价值?作者当前是登录用户(request.user无法访问)。

谢谢。

3 个答案:

答案 0 :(得分:3)

您可以将用户从视图传递到表单,并在表单上覆盖__init__方法以更改字段的初始值:

view.py(使用CBV)类似于:

class SomethingView(FormView):
    def get_form_kwargs(self, *args, **kwargs):
        return dict(
            super(SomethingView, self).get_form_kwargs(*args, **kwargs),
            **{'user': self.request.user}
        )

forms.py类似于:

class SomethingForm(forms.modelForm):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        self.fields['user'].initial = self.user.id
        super(SomethingForm, self).__init__(*args, **kwargs)

答案 1 :(得分:0)

在您的视图中,您可以在实例化时将initial值传递给表单。 您可以在此处详细了解:https://docs.djangoproject.com/en/dev/ref/forms/api/#dynamic-initial-values

答案 2 :(得分:0)

如果您不希望允许用户将任何其他用户设置为此问题的作者,则应在视图中设置此字段并从表单字段中删除“作者”。

例如,如果您使用基于通用类的视图:

class CreateQuestionView(generic.CreateView):
    model = Question
    form_class = QuestionForm

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