我正在尝试输入数据,将其保存并显示在我的视图页面中。我不确定我错过了什么
I'm trying to input data, save it and display it in my view page. I'm not sure what I'm missing
我正在编写一个简单的产品输入应用程序,用户可以在其中输入他们的产品详细信息,将其保存在数据库中并在另一个页面中查看。一切似乎都很顺利,当我 运行 服务器时没有错误消息。但是,当我输入产品详细信息并提交时,页面只是刷新,所有信息都消失了。产品列表页面中没有显示任何内容。我已经阅读了几篇文章,但不确定我到底错过了什么。好像我撞到了一堵看不见的墙。请协助。
谢谢
forms.py
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['SKU', 'Category','Name', 'Platform', 'Price','Discount', 'Date','Cost']
widgets = {
'SKU': forms.TextInput(attrs={
'class': 'form-control', 'id': 'SKU'
}),
'Category': forms.TextInput(attrs={
'class': 'form-control', 'id': 'Category'
}),
'Name': forms.TextInput(attrs={
'class': 'form-control', 'id': 'Name'
}),
'Platform': forms.TextInput(attrs={
'class': 'form-control', 'id': 'Platform'
}),
'Price': forms.NumberInput(attrs={
'class': 'form-control', 'id': 'Price'
}),
'Discount': forms.NumberInput(attrs={
'class': 'form-control', 'id': 'Discount'
}),
'Date': forms.DateInput(attrs={
'class': 'form-control', 'id': 'Date'
}),
'Cost': forms.NumberInput(attrs={
'class': 'form-control', 'id': 'Cost'
}),
}
views.py
# Product views
@login_required(login_url='login')
def create_product(request):
forms = ProductForm()
if request.method == 'POST':
forms = ProductForm(request.POST)
if forms.is_valid():
forms.save()
return redirect('product-list')
context = {
'form': forms
}
return render(request, 'store/create_product.html', context)
class ProductListView(ListView):
model = Product
template_name = 'store/product_list.html'
context_object_name = 'product'
models.py
class Product(models.Model):
SKU = models.CharField(max_length=30, unique=True,default='input SKU')
Category = models.CharField(max_length=200,default='Input Category')
Name = models.CharField(max_length=250,unique=True, default='Input product name')
Platform = models.CharField(max_length=50, default='platform')
Price = models.PositiveIntegerField(default='price')
Discount = models.PositiveIntegerField(default='discount')
Date = models.DateTimeField(date, default='Date')
Cost = models.PositiveIntegerField()
created_date = models.DateField(auto_now_add=True)
def __str__(self):
return self.name
创建产品页面html
{% block content %}
<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<strong class="card-title">Create Product</strong>
</div>
<div class="card-body">
<!-- Credit Card -->
<div id="pay-invoice">
<div class="card-body">
<form action="#" method="post" novalidate="novalidate">
{% csrf_token %}
<div class="form-group">
<label for="SKU" class="control-label mb-1">SKU</label>
{{ form.SKU }}
</div>
<div class="form-group">
<label for="Category" class="control-label mb-1">Category</label>
{{ form.Category }}
</div>
<div class="form-group">
<label for="Name" class="control-label mb-1">Name</label>
{{ form.Name }}
</div>
<div class="form-group">
<label for="Platform" class="control-label mb-1">Platform</label>
{{ form.Platform }}
</div>
<div class="form-group">
<label for="Price" class="control-label mb-1">Price</label>
{{ form.Price }}
</div>
<div class="form-group">
<label for="Discount" class="control-label mb-1">Discount Price</label>
{{ form.Discount }}
</div>
<div class="form-group">
<label for="Date" class="control-label mb-1">Date</label>
{{ form.Date }}
</div>
<div class="form-group">
<label for="Cost" class="control-label mb-1">Cost</label>
{{ form.Cost }}
</div>
<div>
<button id="payment-button" type="submit" class="btn btn-lg btn-info btn-block">
<span id="payment-button-amount">Create Product</span>
</button>
</div>
</form>
</div>
</div>
</div>
</div> <!-- .card -->
</div><!--/.col-->
</div>
{% endblock content %}
商品展示页
{% block content %}
<div class="row">
<div class="col-xl-12">
<div class="card">
<div class="card-body">
<h4 class="box-title">Product List </h4>
</div>
<div class="card-body--">
<div class="table-stats order-table ov-h">
<table class="table ">
<thead>
<tr>
<th class="serial">#</th>
<th>SKU</th>
<th>Category</th>
<th>Name</th>
<th>Platform</th>
<th>Price</th>
<th>Discount</th>
<th>Date</th>
<th>Cost</th>
<th>Date</th>
</tr>
</thead>
<tbody>
{% if product %}
{% for product in product %}
<tr>
<td class="serial">{{ forloop.counter }}</td>
<td>{{ product.SKU }}</td>
<td>{{ product.Category }}</td>
<td>{{ product.Name }}</td>
<td>{{ product.Platform }}</td>
<td>{{ product.Price}}</td>
<td>{{ product.Discount }}</td>
<td>{{ product.Date }}</td>
<td>{{ product.Cost }}</td>
<td>{{ product.created_date }}</td>
</tr>
{% endfor %}
{% else %}
<tr><td>No Product Data</td></tr>
{% endif %}
</tbody>
</table>
</div> <!-- /.table-stats -->
</div>
</div> <!-- /.card -->
</div> <!-- /.col-lg-8 -->
</div>
{% endblock content %}
在views.py
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.db import IntegrityError
@login_required(login_url='login')
def create_product(request):
forms = ProductForm()
context = {"form": forms}
if request.method == 'POST':
# Populate the form with data from post
forms = ProductForm(request.POST)
# Update context dictionary
context['form'] = forms
# Checking form validity
if forms.is_valid():
try:
forms.save()
return HttpResponseRedirect(reverse('product-list')
except IntegrityError:
print("Print data entry to db failed")
# Re-render form page with data
return render(request, 'store/create_product.html', context)
# When form is invalid
else:
# Remove this after your work is done
print("Invalid form received")
# Re-render form page with data
return render(request, 'store/create_product.html', context)
else:
return render(request, 'store/create_product.html', context)
在urls.py
path("something/", ..., name="product-list")
在创建产品页面
...
# Remove anything from action attribute and just put novalidate
<form action="" method="post" novalidate>
...
重定向当前未收到任何信息,您需要检查 form.cleaned_data 并向重定向提供适当的信息。
重定向不知道您未明确提供的任何内容。
return redirect('product-list', product=forms.cleaned_data)
在产品显示页面顶部需要一个名为 product 的变量,您还在模板中覆盖它:{% for product in product %} 可能会导致错误,请将第一个术语更改为 item 或 product2 或其他东西(对于产品中的项目)。
如果您还有其他问题,这可以提供帮助:https://realpython.com/django-redirects/
我正在编写一个简单的产品输入应用程序,用户可以在其中输入他们的产品详细信息,将其保存在数据库中并在另一个页面中查看。一切似乎都很顺利,当我 运行 服务器时没有错误消息。但是,当我输入产品详细信息并提交时,页面只是刷新,所有信息都消失了。产品列表页面中没有显示任何内容。我已经阅读了几篇文章,但不确定我到底错过了什么。好像我撞到了一堵看不见的墙。请协助。 谢谢
forms.py
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['SKU', 'Category','Name', 'Platform', 'Price','Discount', 'Date','Cost']
widgets = {
'SKU': forms.TextInput(attrs={
'class': 'form-control', 'id': 'SKU'
}),
'Category': forms.TextInput(attrs={
'class': 'form-control', 'id': 'Category'
}),
'Name': forms.TextInput(attrs={
'class': 'form-control', 'id': 'Name'
}),
'Platform': forms.TextInput(attrs={
'class': 'form-control', 'id': 'Platform'
}),
'Price': forms.NumberInput(attrs={
'class': 'form-control', 'id': 'Price'
}),
'Discount': forms.NumberInput(attrs={
'class': 'form-control', 'id': 'Discount'
}),
'Date': forms.DateInput(attrs={
'class': 'form-control', 'id': 'Date'
}),
'Cost': forms.NumberInput(attrs={
'class': 'form-control', 'id': 'Cost'
}),
}
views.py
# Product views
@login_required(login_url='login')
def create_product(request):
forms = ProductForm()
if request.method == 'POST':
forms = ProductForm(request.POST)
if forms.is_valid():
forms.save()
return redirect('product-list')
context = {
'form': forms
}
return render(request, 'store/create_product.html', context)
class ProductListView(ListView):
model = Product
template_name = 'store/product_list.html'
context_object_name = 'product'
models.py
class Product(models.Model):
SKU = models.CharField(max_length=30, unique=True,default='input SKU')
Category = models.CharField(max_length=200,default='Input Category')
Name = models.CharField(max_length=250,unique=True, default='Input product name')
Platform = models.CharField(max_length=50, default='platform')
Price = models.PositiveIntegerField(default='price')
Discount = models.PositiveIntegerField(default='discount')
Date = models.DateTimeField(date, default='Date')
Cost = models.PositiveIntegerField()
created_date = models.DateField(auto_now_add=True)
def __str__(self):
return self.name
创建产品页面html
{% block content %}
<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<strong class="card-title">Create Product</strong>
</div>
<div class="card-body">
<!-- Credit Card -->
<div id="pay-invoice">
<div class="card-body">
<form action="#" method="post" novalidate="novalidate">
{% csrf_token %}
<div class="form-group">
<label for="SKU" class="control-label mb-1">SKU</label>
{{ form.SKU }}
</div>
<div class="form-group">
<label for="Category" class="control-label mb-1">Category</label>
{{ form.Category }}
</div>
<div class="form-group">
<label for="Name" class="control-label mb-1">Name</label>
{{ form.Name }}
</div>
<div class="form-group">
<label for="Platform" class="control-label mb-1">Platform</label>
{{ form.Platform }}
</div>
<div class="form-group">
<label for="Price" class="control-label mb-1">Price</label>
{{ form.Price }}
</div>
<div class="form-group">
<label for="Discount" class="control-label mb-1">Discount Price</label>
{{ form.Discount }}
</div>
<div class="form-group">
<label for="Date" class="control-label mb-1">Date</label>
{{ form.Date }}
</div>
<div class="form-group">
<label for="Cost" class="control-label mb-1">Cost</label>
{{ form.Cost }}
</div>
<div>
<button id="payment-button" type="submit" class="btn btn-lg btn-info btn-block">
<span id="payment-button-amount">Create Product</span>
</button>
</div>
</form>
</div>
</div>
</div>
</div> <!-- .card -->
</div><!--/.col-->
</div>
{% endblock content %}
商品展示页
{% block content %}
<div class="row">
<div class="col-xl-12">
<div class="card">
<div class="card-body">
<h4 class="box-title">Product List </h4>
</div>
<div class="card-body--">
<div class="table-stats order-table ov-h">
<table class="table ">
<thead>
<tr>
<th class="serial">#</th>
<th>SKU</th>
<th>Category</th>
<th>Name</th>
<th>Platform</th>
<th>Price</th>
<th>Discount</th>
<th>Date</th>
<th>Cost</th>
<th>Date</th>
</tr>
</thead>
<tbody>
{% if product %}
{% for product in product %}
<tr>
<td class="serial">{{ forloop.counter }}</td>
<td>{{ product.SKU }}</td>
<td>{{ product.Category }}</td>
<td>{{ product.Name }}</td>
<td>{{ product.Platform }}</td>
<td>{{ product.Price}}</td>
<td>{{ product.Discount }}</td>
<td>{{ product.Date }}</td>
<td>{{ product.Cost }}</td>
<td>{{ product.created_date }}</td>
</tr>
{% endfor %}
{% else %}
<tr><td>No Product Data</td></tr>
{% endif %}
</tbody>
</table>
</div> <!-- /.table-stats -->
</div>
</div> <!-- /.card -->
</div> <!-- /.col-lg-8 -->
</div>
{% endblock content %}
在views.py
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.db import IntegrityError
@login_required(login_url='login')
def create_product(request):
forms = ProductForm()
context = {"form": forms}
if request.method == 'POST':
# Populate the form with data from post
forms = ProductForm(request.POST)
# Update context dictionary
context['form'] = forms
# Checking form validity
if forms.is_valid():
try:
forms.save()
return HttpResponseRedirect(reverse('product-list')
except IntegrityError:
print("Print data entry to db failed")
# Re-render form page with data
return render(request, 'store/create_product.html', context)
# When form is invalid
else:
# Remove this after your work is done
print("Invalid form received")
# Re-render form page with data
return render(request, 'store/create_product.html', context)
else:
return render(request, 'store/create_product.html', context)
在urls.py
path("something/", ..., name="product-list")
在创建产品页面
...
# Remove anything from action attribute and just put novalidate
<form action="" method="post" novalidate>
...
重定向当前未收到任何信息,您需要检查 form.cleaned_data 并向重定向提供适当的信息。 重定向不知道您未明确提供的任何内容。
return redirect('product-list', product=forms.cleaned_data)
在产品显示页面顶部需要一个名为 product 的变量,您还在模板中覆盖它:{% for product in product %} 可能会导致错误,请将第一个术语更改为 item 或 product2 或其他东西(对于产品中的项目)。
如果您还有其他问题,这可以提供帮助:https://realpython.com/django-redirects/