2014-01-14 31 views
1

我试图让request.user进入ModelForm。我觉得我已经试过这一切排列过载(每Django form, request.post and initial)的Django ModelForms __init__ kwargs创建和更新

__init__ 

参数来试图把它作为(每Django form __init__() got multiple values for keyword argument)一kwargs。我

它看起来像kwargs是最好的方法,但我完全受它困扰。

这里的的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): 
     super(DistListForm, self).__init__(*args, **kwargs) 
     user = kwargs.pop('user', None) 
     up = UserProfile.objects.get(user=user) 
     /.. etc ../ 

下面是如何创建功能当前工作:

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}) 

会抛出一个TypeError:初始化()得到了一个意想不到的关键字参数 '用户'。更新方法同样无益:

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,如果这有所作为。

+1

的默认参数你之前,你传递kwargs的超级__init__需要从kwargs“啪”的用户 –

+0

ARRRRGGGGHHHHH !!!!! $#HDFA $#@#H#$$!$ HF 非常感谢。 – ghiotion

回答

3

你必须弹出呼叫超级之前用户参数(),所以它不会冲突机智的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) 
0

这只是昨天确实做到了,在Django的1.5,我能够做到:在我的ModelForm

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

。然后我只用用户而不必从kwargs中弹出它。

+0

我用这种方法遇到的问题是从帖子中获取用户。我无法获得正确的参数DistListForm(request.POST,user = request.user)。因为你已经改变了初始化的顺序。没有为我工作,但如果你有代码工作的职位,我很乐意看到它。 – ghiotion

+0

我的方法是使用基于类的视图,我不得不重写'get_form_kwargs'并执行'kwargs.update({'user':self.request.user})''。这个页面上的帖子实际上让我想知道我的工作如此完美。看来更好的方法是用'kwargs.pop'显式地获取关键字参数。 – trpt4him