首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >位于/edit-menu/edit/ 'Product‘对象的AttributeError没有属性'is_valid’

位于/edit-menu/edit/ 'Product‘对象的AttributeError没有属性'is_valid’
EN

Stack Overflow用户
提问于 2020-04-06 07:24:34
回答 2查看 331关注 0票数 0

我正在尝试从product模型中提取所有的产品名称,在屏幕上显示它们和它们的价格,然后能够更改任何这些项目的产品价格。我有它,所以它列出了他们,并有一个输入字段的价格,但得到这个错误时,我提交。位于/edit-menu/edit/ 'Product‘对象的AttributeError没有属性'is_valid’

请帮帮忙。

views.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.IntegerField()
    slug = models.SlugField()

    def __str__(self):
        return self.name        

html:

代码语言:javascript
复制
<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和我的普通编辑菜单页面,用户可以在其中添加菜单项

代码语言:javascript
复制
path('edit-menu/', views.add_to_menu, name='Edit Menu'),

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

现在我收到这个错误: NoReverseMatch at /edit-menu/edit/ Reverse for '‘not found。'‘不是有效的视图函数或模式名称。

新的views.py:

代码语言:javascript
复制
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)

现在我得到这个错误:没有找到带有参数'({'object_list':,,,]>}的‘编辑菜单’的/ NoReverseMatch -Menu/Edit/ Reverse。尝试了1个模式:'edit-menu/$‘

这个列表就是产品列表。

最新编辑:

现在它接受了值,但不是更新数据库中的价格表单,而是在价格列中输入一个没有名称或slug的价格。它本质上只是添加rathe而不是替换数据。

forms.py:

代码语言:javascript
复制
class ProductModelForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['price'] 

Views.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

发布于 2020-04-06 08:05:06

该产品是一个models.Model实例,它没有is_valid方法,您应该首先编写一个表单

在forms.py first导入ModelForm和产品型号的应用程序目录中创建名为forms.py的文件

代码语言:javascript
复制
     from django import forms
     from .models import Product

然后创建与您的Product模型相关联的适当表单类,如下所示

代码语言:javascript
复制
    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中导入表单

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2020-04-06 10:32:09

在你的models.py

class Product(models.Model):没有is_valid=models.BooleanField(default=True)字段。

urls.py

你就是不能这样写

代码语言:javascript
复制
path('edit-menu/', views.add_to_menu, name='Edit Menu'),

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

相反,应该是这样的

代码语言:javascript
复制
path('edit-menu/', views.add_to_menu, name='edit-menu'),

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

所以现在在你的views.py

您将把返回重定向编写为

代码语言:javascript
复制
  return redirect('edit-menu', context)
            else: 
                return redirect('edit-menu', context)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61050806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档