3

我有一个模型,它有一个 author ForeignKey,例如:

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

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

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

有两个问题:

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

2 回答 2

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
于 2014-07-29T15:31:56.277 回答
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(我没有调用)。superpost

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

于 2012-12-01T12:35:58.753 回答