AttributeError в / edit-menu / edit / объект 'Product' не имеет атрибута 'is_valid' - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь извлечь все названия продуктов из модели продукта, отобразить их и их цены на экране, а затем иметь возможность изменить цену продукта любого из этих элементов. У меня есть, поэтому он перечисляет их и имеет поле для ввода цены, но я получаю эту ошибку при отправке. AttributeError в / edit-menu / edit / объект 'Product' не имеет атрибута 'is_valid'

Пожалуйста, помогите.

views.py:

def edit_menu(request):
    queryset = Product.objects.all()
    context = { "object_list": queryset }
    if request.method == 'POST':
        post=Product()
        if request.POST.get('price'):
            if post.is_valid():
                post.price= request.POST.get('price')
                post.save()

                return redirect('mis446/edit-menu.html', context)
            else: 
                return redirect(request, 'mis446/edit-menu-item.html', context)
        else:
            return render(request, 'mis446/edit-menu-item.html', context)
    else:

        return render(request, 'mis446/edit-menu-item.html', context)

Models.py :

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.IntegerField()
    slug = models.SlugField()

    def __str__(self):
        return self.name        

html:

<div class = "container">
    <form method = "post">
        {% csrf_token %}

         {% for instance in object_list %}
{{ instance.name}}: <input type="number" name="price" value = '{{ instance.price }}'/><br>

    {% endfor %}
<button type ="submit">Submit Changes</button>
    </form>
</div>

Вот мой urls.py для этого и моя обычная страница меню редактирования, где пользователи добавляют пункты меню

path('edit-menu/', views.add_to_menu, name='Edit Menu'),

url(r'^edit-menu/edit/$',views.edit_menu, name='Edit Menu Item'),

Теперь я получаю эту ошибку: NoReverseMatch в / edit-menu / edit / Reverse for '' не найден. '' не является допустимой функцией представления или именем шаблона.

Новые views.py:

def edit_menu(request):

    queryset = Product.objects.all()
    context = { "object_list": queryset }
    if request.method == 'POST':
        post=ProductModelForm(request.POST)
        if request.POST.get('price'):
            if post.is_valid():
                post.save()

                return redirect('Edit Menu', context)
            else: 
                return redirect('Edit Menu', context)
        else:
            return render(request, 'mis446/edit-menu-item.html', context)
    else:

        return render(request, 'mis446/edit-menu-item.html', context)

, и теперь я получаю эту ошибку: NoReverseMatch в / edit-menu / edit / Reverse for 'Редактировать меню' с аргументами '({' object_list ':,,,,,,,]>},)' не найдено. Попробован 1 шаблон (ов): ['edit \ -menu / $']

Этот список является списком продуктов.

Самое новое редактирование:

Сейчас он принимает значений, но вместо того, чтобы обновлять форму цены в базе данных, она просто помещает цену в столбец цены без имени или слагаемого. По сути, это просто добавление, а не замена данных.

forms.py:

class ProductModelForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['price'] 

Views.py:

def edit_menu(request):

    queryset = Product.objects.all()
    context = { "object_list": queryset }
    if request.method == 'POST':
        post=ProductModelForm(request.POST)
        if request.POST.get('price'):
            if post.is_valid():

                post.save()

                return redirect('Edit Menu Item')
            else: 
                return redirect('Edit Menu Item')
        else:
            return render(request, 'mis446/edit-menu-item.html', context)
    else:

        return render(request, 'mis446/edit-menu-item.html', context)

HTML:

<div class = "container">
    <form method = "post">
        {% csrf_token %}
 <select>
         {% for instance in object_list %}

<option name = "name">{{ instance.name}}: ${{ instance.price }}</option>

    {% endfor %}
    </select>
    <input type="number" name="price" value = '{{ instance.price }}'/><br>
<button type ="submit">Submit Changes</button>
    </form>
</div>

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

В вашем models.py

В class Product(models.Model): нет поля is_valid=models.BooleanField(default=True).

В urls.py

Вы просто не можете писать вот так

path('edit-menu/', views.add_to_menu, name='Edit Menu'),

url(r'^edit-menu/edit/$',views.edit_menu, name='Edit Menu Item'),

Скорее так и должно быть

path('edit-menu/', views.add_to_menu, name='edit-menu'),

url(r'^edit-menu/edit/$',views.edit_menu, name='edit-menu-item'),

Так что теперь в вашем views.py

вы напишете перенаправление возврата как

  return redirect('edit-menu', context)
            else: 
                return redirect('edit-menu', context)
0 голосов
/ 06 апреля 2020

Продукт является экземпляром models.Model, и у него нет метода is_valid. Сначала вы должны написать форму

. Создайте файл в каталоге приложения с именем forms.py, сначала в forms.py. импортируйте ModelForm и модель вашего продукта

     from django import forms
     from .models import Product

, затем создайте соответствующий класс формы с вашей моделью продукта, как показано ниже

    class ProductModelFrom(forms.ModelForm):
        class Meta:
            model = Product
            fields = ['name', 'price'] # specify which field you need to be in the form
            # I didn't write the slug field there because you probably don't want the user to enter the slug.
            # the better way is to manage slugs in models.py and prepopulate it from the name

, затем в views.py импортируйте форму

from .forms import ProductModelForm

def edit_menu(request):
    queryset = Product.objects.all()
    context = { "object_list": queryset }
    if request.method == 'POST':
        post=ProductModelFrom(request.POST) # initialize form with data entered in front-end
        if request.POST.get('price'):
            if post.is_valid():
                # post.price= request.POST.get('price') Remove this line too
                # because when we initialize the form, it would contains price and name entered by the user
                post.save()

                return redirect('mis446/edit-menu.html', context)
            else: 
                return redirect('mis446/edit-menu-item.html', context) # redirect does not need the request
        else:
            return render(request, 'mis446/edit-menu-item.html', context)
    else:

        return render(request, 'mis446/edit-menu-item.html', context)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...