Forms.py создание форм с моделью ForeignKey. Магазин должен иметь возможность добавлять товары только в свой собственный магазин. (Django)

Магазин должен иметь возможность создавать товар только для себя, а не для других магазинов.

models.py

from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse
from django.utils.text import slugify
from django.dispatch import receiver

class Store(models.Model):
    name = models.CharField(max_length=100)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    slug = models.SlugField(unique=True, blank=False, null=False)


class Product(models.Model):
    store = models.ForeignKey(Store, on_delete=models.CASCADE, null=False, blank=False)
    name = models.CharField(max_length=200)
    price = models.FloatField()
    image = models.ImageField(null=True, blank=True)

forms.py

from .models import Store, Product
from django import forms

class AddProductForm(forms.ModelForm):

    store = forms.ModelChoiceField(queryset=Store.objects.all())

    class Meta:
        model = Product
        fields = ('store', 'name', 'price', 'image',)

        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Name of your product'}),
            'price': forms.NumberInput(attrs={'class': 'form-control', 'placeholder': 'Price of your product'}),
            'image': forms.FileInput(attrs={'class': 'form-control'}),
        }

В моем файле views.py я пробовал разные вещи, но ничего не сработало, поэтому я сохраняю его там, чтобы вы знали, что я пробовал. views.py

from django.shortcuts import render, redirect
from django.urls.base import reverse
from django.contrib.auth.models import User, Group
from django.contrib.auth import authenticate, login
from .models import Product, Store
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView


class AddProductView(CreateView):

    model = Product
    form_class = AddProductForm
    template_name = 'app1/add-product.html'


    # def get_initial(self):
    #     if Store.objects.filter(owner=self.request.user).exists():
    #         initial = super(AddProductView, self).get_initial()
    #         initial['store'] = Store.objects.get(pk=self.kwargs['pk'])
    #         return initial


    def form_valid(self, form):
        form.instance.owner = self.request.user
        if Store.objects.filter(owner=self.request.user).exists():
            self.store = Store.objects.filter(Store__owner=self.request.user)

            form = form.cleaned_data
            form['store'] = self.store
            
            return super().form_valid(form)
            
        else:
            return super().form_invalid(form)

    

    
    def form_invalid(self, form):
        return super().form_invalid(form)

    
    def get_context_data(self, **kwargs):
        pass

    
    def get_success_url(self):
        return reverse('store', kwargs={'slug': self.object.store.slug})

Я не знаю, что искать в гугле, я пробовал эти темы:

Как автозаполнить переменную внешним ключом в форме django?

Django - Forms - autofill & hide foreign key field

Просто пример импорта в views.py

from django.shortcuts import render, redirect
from django.urls.base import reverse
from django.contrib.auth.models import User, Group
from django.contrib.auth import authenticate, login
from .models import Product, Store
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView

В views.py просто добавьте это

class AddProductView(CreateView):

    model = Product
    form_class = AddProductForm
    template_name = 'app1/add-product.html'



  # add this code |
  #               V

    def get_initial(self):
        if Store.objects.filter(owner=self.request.user).exists():
            user = self.request.user
            initial = super(AddProductView, self).get_initial()
            initial['store'] = Store.objects.get(owner=user)
            return initial    


    ...

Убедитесь, что вы отредактировали его для имен и потребностей вашей модели.

Вернуться на верх