【问题标题】:__init__() got an unexpected keyword argument 'user_id'; Classed Based Views__init__() 得到了一个意外的关键字参数“user_id”;基于分类的视图
【发布时间】:2014-07-13 18:45:56
【问题描述】:

我收到了上述标题中所述的错误。我正在尝试为表单提供 user_id,因为我的模型需要它才能添加“表”。但是,我对 get_form_kwargs 的使用似乎有问题。

这是模型:

from django.db import models
from django.contrib.auth.models import User

class Vtable(models.Model):
    user = models.ForeignKey(User)
    table_name = models.CharField(max_length=200)
    added_date = models.DateTimeField('date added')

class Vdata(models.Model):
    table_id = models.ForeignKey(Vtable)
    table_pk = models.IntegerField()
    column_1 = models.CharField(max_length=200)
    column_2 = models.CharField(max_length=200)
    added_date = models.DateTimeField('date added')

这是视图:

from django.shortcuts import render
from django.http import HttpResponse
from django.views import generic
from vtables.models import Vtable

class CreateTableView(generic.CreateView):

    model = Vtable
    fields = ['table_name']

    def get_form_kwargs(self):
        # pass "user" keyword argument with the current user to your form
        kwargs = super(CreateTableView, self).get_form_kwargs()
        kwargs['user_id'] = self.request.user
        return kwargs

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    CreateView(或任何模型表单)生成的表单类没有任何外键的_id 字段。相反,它有一个字段user,即ModelChoiceField

    此外,您的表单中不应包含该逻辑。表单只是捕获和验证用户输入的一种方式。哪个用户创建了一个对象不是用户输入,这样的逻辑应该在你的视野中,例如:

    class CreateTableView(generic.CreateView):
    
        model = Vtable
        fields = ['table_name']
    
        def form_valid(self, form):
            form.instance.user = self.request.user
            return super(CreateTableView, self).form_valid(form)
    

    【讨论】:

    • 谢谢!很好很简单。
    【解决方案2】:

    为了将自定义值传递给表单,您必须创建自己的表单类并将其传递给视图。视图创建的默认表单类不知道如何处理您的 user_id 参数,这就是错误的来源。

    这是一个关于如何传递自定义表单类的示例,首先是表单类:

    class MyForm(forms.ModelForm):
        class Meta:
            model = Vtable
    
        def __init__(self, *args, **kwargs):
            user_id = kwargs.pop('user_id') # Pop out your custom argument
            super(MyForm, self).__init__(args, kwargs) # Initialize your form
                                                       # as usual
            self.user_id = user_id # Add it as an instance variable
    

    那么,在你看来:

    class CreateVTable(generic.CreateView):
        form_class = MyForm
        model = Vtable
    

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 2013-04-13
      • 2013-02-02
      • 2021-03-17
      • 2013-05-05
      • 2016-06-05
      • 2020-08-20
      • 2021-09-20
      • 2014-05-12
      相关资源
      最近更新 更多