Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django ModelForms __init__ kwargs create and update

Tags:

django

I'm trying to get the request.user into a ModelForm. I feel like I've tried all permutations of this from overloading the

__init__ 

argument (per Django form, request.post and initial) to trying to pass it as a kwargs (per Django form __init__() got multiple values for keyword argument). I

It does seem like the kwargs is the best approach but I'm totally stymied by it.

Here's the 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  ../

Here's how the create function currently works:

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

which throws a TypeError: init() got an unexpected keyword argument 'user'. The update method is equally unhelpful:

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)

It also throws the same error.

I've been banging my head against this wall for two hours now. What is the correct way to pass a keyword argument into a ModelForm?

This is Django 1.6.1 if that makes a difference.

like image 680
ghiotion Avatar asked Feb 19 '26 02:02

ghiotion


1 Answers

You have to pop the user argument before call super() so it will no conflict wit the default arguments of 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)
like image 169
Mario César Avatar answered Feb 21 '26 15:02

Mario César



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!