如何使用通用视图在视图中设置模型的字段?

时间:2012-12-01 12:35:59

标签: django django-generic-views

我有一个模型,其中有一个作者ForeignKey,如下:

class Appointment(models.Model):
    # ...
    author = models.ForeignKey(User)

我希望在为当前登录用户创建约会时自动设置author字段。换句话说,作者字段不应出现在我的Form类中:

class AppointmentCreateForm(ModelForm):
    class Meta:
        model = Appointment
        exclude = ('author')

有两个问题:

  1. 如何在通用CreateView中访问表单并设置author
  2. 如何告诉表单保存排除字段以及从用户输入中读取的值?

2 个答案:

答案 0 :(得分:7)

以下似乎稍微简单一些。请注意,self.request在View.as_view

中设置
class AppointmentCreateView(CreateView):        
    model=Appointment
    form_class = AppointmentCreateForm

    def get_form(self, form_class):
        form = super(AppointmentCreateView, self).get_form(form_class)
        # the actual modification of the form
        form.instance.author = self.request.user
        return form

答案 1 :(得分:2)

我已经修改了我的通用视图子类:

class AppointmentCreateView(CreateView):        
    model=Appointment
    form_class = AppointmentCreateForm

    def post(self, request, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)

        # the actual modification of the form
        form.instance.author = request.user

        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

这里有一些重要的部分:

  • 我修改了instance字段,其中包含将要保存的实际模型。
  • 您当然可以摆脱form_class
  • 我需要修改的post方法是层次结构中的两个类,所以我需要将基本代码合并到self.object = None行,将重载和基数合并到一个函数(我没有在super中调用post。)

我认为这是解决相当常见问题的好方法,而且我再一次不必编写自己的自定义视图。