Migdotcom
Migdotcom

Reputation: 72

__init__() got an unexpected keyword argument 'user' when I try to filter

I would like to filter through the restaurants that the request.user has done. following the docs but i keep getting __init__() got an unexpected keyword argument user when I try to filter

forms.py

from .models import Restaurant
from .models import  Item
from django import forms


class LocationCreate(forms.ModelForm):

    class Meta:
        model = Item
        fields = [
            'restaurant'
            'category',
            'food_name'
        ]
    def __init__(self, user=None, *args, **kwargs):
        super(ItemCreate, self).__init__(*args, **kwargs)
        self.fields['restaurant'].queryset = Restaurant.objects.filter(owner=user) 

models.py

class Restaurant(models.Model):
    restaurant_name    = models.CharField(max_length=250)
    restaurant_photo   = models.ImageField(upload_to='roote_image')
    category      = models.ManyToManyField(Category)
    timestamp     = models.DateTimeField(auto_now_add=True, null=True)
    updated       = models.DateTimeField(auto_now=True, null=True)
    owner          = models.ForeignKey(User)

    def get_absolute_url(self):
        return reverse('post:detail', kwargs={'pk': self.pk})


class Item(models.Model):
    restaurant= models.ForeignKey(Roote, on_delete=models.CASCADE, null=True)
    food_name = models.CharField(max_length=1000)
    category = models.CharField(max_length=250)
    owner      = models.ForeignKey(User)
    def __str__(self):
        return  self.food_name

    def get_absolute_url(self):
        return reverse('post:detail', kwargs={'pk': self.pk})

views.py

class ItemCreate(CreateView):
    model = Item
    fields = ['restaurant','category ', 'food_name ']
    success_url = reverse_lazy('post:index')


    def form_valid(self, form):
        if form.is_valid():
            roote = restaurant.objects.filter(owner =self.request.user)
            instance = form.save(commit=False)
            instance.owner = self.request.user
        return super(ItemCreate, self).form_valid(form)

    def get_form_kwargs(self):
        kwargs = super(ItemCreate, self).get_form_kwargs()
        kwargs['user'] = self.request.user 
        return kwargs

detail.html

{% block body %}

    <div class="col-sm-6 col-sm-offset-3">
        <img src="{{ restaurant.restaurant_photo.url }}" style="width: 250px;" >


        <h1>{{ restaurant.restaurant_name }}</h1>

         {% for item in restaurant.item_set.all %}
             {{ item.food_name }}: {{ item.category}}
             <br>

         {% endfor %}

The form works without the filter but it brings in every instance of a restaurant that has been made in the web site

full error:

return form_class(**self.get_form_kwargs())
TypeError: __init__() got an unexpected keyword argument 'user'

Upvotes: 1

Views: 3561

Answers (2)

Sardorbek Imomaliev
Sardorbek Imomaliev

Reputation: 15400

You forgot to add form_class attribute to your view

class ItemCreate(CreateView):
    model = Item
    success_url = reverse_lazy('post:index')
    form_class = LocationCreate  # <- here

    def form_valid(self, form):
        if form.is_valid():
            roote = restaurant.objects.filter(owner=self.request.user)
            instance = form.save(commit=False)
            instance.owner = self.request.user
        return super(ItemCreate, self).form_valid(form)

    def get_form_kwargs(self):
        kwargs = super(ItemCreate, self).get_form_kwargs()
        kwargs['user'] = self.request.user 
        return kwargs

Upvotes: 3

Remi Smirra
Remi Smirra

Reputation: 2539

According to the docs, this is the signature of the __init__ method for a ModelForm:

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

See that there is no user? This is what the error message is telling you. If you want to get the user, try via self.request.user (or something similiar, depending on what middlewares you use).

Hope that helps!

Upvotes: 0

Related Questions