2014-01-14 71 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