我正在尝试从product模型中提取所有的产品名称,在屏幕上显示它们和它们的价格,然后能够更改任何这些项目的产品价格。我有它,所以它列出了他们,并有一个输入字段的价格,但得到这个错误时,我提交。位于/edit-menu/edit/ 'Product‘对象的AttributeError没有属性'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 at /edit-menu/edit/ Reverse for '‘not found。'‘不是有效的视图函数或模式名称。
新的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)现在我得到这个错误:没有找到带有参数'({'object_list':,,,]>}的‘编辑菜单’的/ NoReverseMatch -Menu/Edit/ Reverse。尝试了1个模式:'edit-menu/$‘
这个列表就是产品列表。
最新编辑:
现在它接受了值,但不是更新数据库中的价格表单,而是在价格列中输入一个没有名称或slug的价格。它本质上只是添加rathe而不是替换数据。
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>发布于 2020-04-06 08:05:06
该产品是一个models.Model实例,它没有is_valid方法,您应该首先编写一个表单
在forms.py first导入ModelForm和产品型号的应用程序目录中创建名为forms.py的文件
from django import forms
from .models import Product然后创建与您的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)发布于 2020-04-06 10:32:09
在你的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)https://stackoverflow.com/questions/61050806
复制相似问题