1

Je voudrais filtrer les restaurants que request.user a fait. suivant les docs, mais je continue à obtenir __init__() a un argument de mot-clé inattendu user lorsque je tente de filtrer__init __() a un argument de mot clé inattendu 'user' lorsque j'essaie de filtrer

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

La forme fonctionne sans filtre, mais il apporte dans tous les cas d'un restaurant qui a été fait dans le site Web

pleine erreur:

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

S'il vous plaît fournir trace pile complète –

+0

ajouté autant que possible – Migdotcom

Répondre

1

Vous avez oublié d'ajouter form_class attribut à votre vue

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 
+0

Merci qui a fonctionné. Juste comme une note secondaire j'ai également eu une erreur qui a indiqué que j'ai dû choisir des champs ou form_class dans le views.py. J'ai choisi form_class – Migdotcom

0

Selon le docs, c'est la signature de la méthode __init__ pour une ModelForm:

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

Voir qu'il n'y a pas user? C'est ce que le message d'erreur vous dit. Si vous voulez obtenir l'utilisateur, essayez via self.request.user (ou quelque chose de similaire, selon les logiciels que vous utilisez).

Espérons que ça aide!

+0

afin d'être clair prennes utilisateur à partir des paramètres initiaux et essayer de simplement utiliser l'auto filtre .request.user seul? – Migdotcom

+0

oui, cela devrait faire l'affaire –