【问题标题】:Django ModelForms __init__ kwargs create and updateDjango ModelForms __init__ kwargs 创建和更新
【发布时间】:2014-02-02 20:43:47
【问题描述】:

我正在尝试将 request.user 放入 ModelForm。我觉得我已经尝试过所有的重载排列方式

__init__ 

参数(根据Django form, request.post and initial)试图将其作为kwargs 传递(根据Django form __init__() got multiple values for keyword argument)。我

看起来 kwargs 是最好的方法,但我完全被它所阻碍。

这是模型表单:

class DistListForm(ModelForm):
    members = ModelMultipleChoiceField(queryset=Company.objects.none())
    class Meta:
        model = DistList
        fields = ['name', 'description', 'members', 'is_private']

    def __init__(self, *args, **kwargs):
        super(DistListForm, self).__init__(*args, **kwargs)
        user = kwargs.pop('user', None)
        up = UserProfile.objects.get(user=user)
        /.. etc  ../

以下是 create 函数当前的工作方式:

def distlistcreate(request):
    user = {'user': request.user}
    form = DistListForm(**user)
    if request.method ==  'POST':
        form = DistListForm(request.POST)
        if form.is_valid():
            distlist = form.save(commit=False)
            distlist.creator = request.user
            distlist.save()
            form.save_m2m()

            return HttpResponseRedirect(reverse('distlistsmy'))
    return render(request, 'distlistcreate.html',{'form':form})

引发类型错误:init() 获得了意外的关键字参数“用户”。更新方法同样无用:

def distlistupdate(request, object_id):
    distlist = get_object_or_404(DistList, id=object_id)
    form = DistListForm(user=request.user, instance=distlist)
    if request.method ==  'POST':
        form = DistListForm(request.POST, user=request.user)

它也会抛出同样的错误。

我已经把头撞在墙上两个小时了。将关键字参数传递给 ModelForm 的正确方法是什么?

这是 Django 1.6.1,如果有区别的话。

【问题讨论】:

  • 在将 kwargs 传递给超级 init 之前,您需要从 kwargs 中“弹出”用户
  • ARRRRGGGGHHHHH!!!! $#HDFA$#@#H#$$!$HF 非常感谢。

标签: django


【解决方案1】:

你必须在调用 super() 之前弹出用户参数,这样它就不会与 ModelForm 的默认参数冲突

class DistListForm(ModelForm):
    members = ModelMultipleChoiceField(queryset=Company.objects.none())
    class Meta:
        model = DistList
        fields = ['name', 'description', 'members', 'is_private']

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(DistListForm, self).__init__(*args, **kwargs)
        user_profile = UserProfile.objects.get(user=user)

【讨论】:

    【解决方案2】:

    昨天刚刚在 Django 1.5 上做到了这一点,我能够做到:

    def __init__(self, user, *args, **kwargs):

    在我的 ModelForm 上。然后我只使用用户,而不必从 kwargs 中弹出它。

    【讨论】:

    • 我在使用这种方法时遇到的问题是从帖子中获取用户。我无法获得正确的参数 DistListForm(request.POST, user=request.user)。因为你改变了初始化的顺序。对我不起作用,但如果你的代码适用于这篇文章,我很乐意看到它。
    • 我的方法是使用基于类的视图,我必须覆盖 get_form_kwargs 并执行 kwargs.update({'user': self.request.user})。此页面上的帖子实际上让我想知道我的工作如何如此出色。似乎更好的方法是使用 kwargs.pop 显式获取关键字参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2017-10-16
    • 1970-01-01
    • 2013-07-19
    • 2018-11-06
    • 1970-01-01
    相关资源
    最近更新 更多