Django Python AttributeError Значение исключения: объект 'WSGIRequest' не имеет атрибута 'shop' - PullRequest
0 голосов
/ 12 февраля 2019

Я пишу модуль сайта покупок Django. Пользователь может добавлять магазин и товары.

Когда пользователь заполняет форму для добавления товара и нажимает кнопку Отправить, django выдаст эту ошибку, было бы очень полезно, если бы кто-то мог поставить некоторыесвет на проблему, спасибо.

Ошибка

'WSGIRequest' object has no attribute 'shop'

Request Method:     POST
Request URL:    http://127.0.0.1:8000/15/add_product/
Django Version:     2.1.2
Exception Type:     AttributeError
Exception Value:    

'WSGIRequest' object has no attribute 'shop'

Exception Location:     C:\Users\MILAN\PycharmProjects\DjangoProject\shopsurfer\views.py in form_valid, line 191
Python Executable:  C:\Users\MILAN\PycharmProjects\DjangoProject\venv\Scripts\python.exe
Python Version:     3.7.0
Python Path:    

['C:\\Users\\MILAN\\PycharmProjects\\DjangoProject',
 'C:\\Users\\MILAN\\PycharmProjects\\DjangoProject\\venv\\Scripts\\python37.zip',
 'C:\\Users\\MILAN\\AppData\\Local\\Programs\\Python\\Python37\\DLLs',
 'C:\\Users\\MILAN\\AppData\\Local\\Programs\\Python\\Python37\\lib',
 'C:\\Users\\MILAN\\AppData\\Local\\Programs\\Python\\Python37',
 'C:\\Users\\MILAN\\PycharmProjects\\DjangoProject\\venv',
 'C:\\Users\\MILAN\\PycharmProjects\\DjangoProject\\venv\\lib\\site-packages',
 'C:\\Users\\MILAN\\PycharmProjects\\DjangoProject\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.7.egg']

Server time:    Tue, 12 Feb 2019 14:37:12 +0000

product_form.html

это где всеHTML-код, который генерирует форму из входного

{% extends 'shopsurfer/base.html' %}
{% block title %}Add a New Product{% endblock %}
{% block album_active %}active{% endblock %}

{% block body %}
    <div class="container=fluid">
        <div class="row">
            <div class="col-sm-12 col-md-7">
                <div class="panel panel-default">
                    <div class="panel-body">
                        <form class="form-horizontal" action="" method="post" enctype="multipart/form-data">
                            {% csrf_token %}


{% for field in form %}
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <span class="text-danger small">{{ field.errors }}</span>
        </div>
        <label class="control-label col-sm-2" for="song_title">{{ field.label_tag }}</label>
        <div class="col-sm-10">{{ field }}</div>
    </div>
{% endfor %}

                            <div class="form-group">
                                <div class ="col-sm-offset-2 col-sm-10">
                                    <button type="submit" class="btn btn-success">submit</button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

Models.py файла, содержащего модель Shop, Product, User, которая хранится в базе данных sqlite по умолчанию

class Product(models.Model):
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
    name = models.CharField(max_length=128)
    category = models.CharField(max_length=32)
    lot = models.DecimalField(max_digits=16, decimal_places=0)
    specs = models.CharField(max_length=5120)
    price = models.FloatField(max_length=16)
    product_logo = models.FileField(default='')


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

    def __str__(self):
        return self.name

Forms.py это поле формы, которое используется для создания формы для модели

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'category', 'lot', 'specs', 'price', 'product_logo']

Views.py вот код для AddProduct, которыйэто вещь, в которой есть ошибка, но я не могу найти что.

class AddProduct (LoginRequiredMixin, CreateView):
    login_url = '/login_user'
    redirect_field_name = 'redirect_to'
    model = Product
    fields = ['name', 'category', 'lot', 'specs', 'price', 'product_logo']

    def form_valid(self, form):
        object_product = form.save(commit=False)
        object_product.shop = self.request.shop
        object_product.save()
        return super(AddProduct, self).form_valid(form)

1 Ответ

0 голосов
/ 13 февраля 2019

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

urls.py

 url(r'^(?P<pk>[0-9]+)/add_product/$', views.AddProduct.as_view(), name='add_product'),

views.py

pk = self.kwargs['pk']
object.shop = get_object_or_404(Shop, pk=pk)

и, сделав это, мы сможем сохранить значение в базе данных.

Кстати, спасибо за помощь @ malberts

...