[英]Django how a user can add a new attribute to a model from template
我有以下 model:
模型.py:
class Product(models.Model):
name = models.CharField(blank=False, max_length=255)
description = models.TextField()
class Ingredients(models.Model):
ingredients = models.ForeignKey(Product, related_name='ingredients', on_delete=models.CASCADE, null=True)
salt = models.IntegerField(default=0)
pepper = models.IntegerField(default=0)
視圖.py:
def productdetails(request, product_pk):
product = get_object_or_404(Product, pk=product_pk)
ingredients = get_object_or_404(Ingredients, ingredients_id=product_pk)
salt = ingredients.salt
pepper = ingredients.pepper
if request.method == 'POST':
form = IngredientsForm(request.POST)
newvalue = form.save(commit=False)
newvalue.user = request.user
newvalue.save()
return render(request, 'xxx.html', {'product': product, 'form': IngredientsForm, 'salt': salt, 'pepper': pepper})
return render(request, 'xxx.html', {'product': product, 'iform': IngredientsForm, 'salt': salt, 'pepper': pepper})
def updateproduct(request, product_pk):
ingredients = get_object_or_404(Ingredients, ingredients_id=product_pk)
form = IngredientsForm(request.POST or None, instance = ingredients)
salt = ingredients.salt
pepper = ingredients.pepper
if form.is_valid():
form.save()
products = Product.objects.filter()
return render(request, 'xxx.html', {'products': products})
return render(request, 'xxx.html', {'form': form, 'salt': salt, 'pepper': pepper, 'product_pk': product_pk})
def createingredients(request, product_pk):
if request.method == 'POST':
ingredients = get_object_or_404(Ingredients, ingredients_id=product_pk)
form = IngredientsForm(request.POST or None, instance=ingredients
salt = ingredients.salt
pepper = ingredients.pepper
# here should be the code
return render(request, 'xxx.html', {'ingredients': ingredients, 'product_pk': product_pk})
在模板中:
<div class="container">
<strong>Ingredients:</strong>
<b>Salt: </b>{{ salt }} g <br>
<b>Pepper: </b>{{ pepper }} g <br>
<br>
Update ingredients:
{% if error %}
<div class="alert alert-danger" role="alert">
{{ error }}
</div>
{% endif %}
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Update">
</form>
<br>
Add ingredient:
<form action="{% url 'createingredients' product_pk %}" method="POST">
{% csrf_token %}
<br />
<p>Name: <input type="text" name="ingredientname" /> Value: <input type="number" name="ingredientvalue" /> <input type="submit" value="Add"></p>
<br />
</form>
我試圖實現的是,在模板中,用戶應該能夠按照自己的意願添加、刪除、更新和查看成分。 例如,用戶可以添加該產品的糖成分(未在成分模型中定義),值為 150,然后刪除鹽成分。 在這種情況下,模板將只需要列出該產品的糖和胡椒(因為鹽已被用戶刪除)成分,並允許用戶始終更改值或從產品詳細信息頁面添加/刪除該產品的更多成分。 應該允許用戶添加任意數量的成分,無論這些成分是否不在成分模型中。 感謝任何幫助。
您想要的需要在成分表中添加新列。 從理論上講,您可以通過一些腳本和自定義管理命令以及 cron 作業來實現這一點,但這需要您構建一個完整的子系統來完成它。 此外,允許用戶直接訪問數據庫結構不是您在生產中應該考慮的做法。 你需要改變你的數據庫設計——用類型/名稱、值、單位三元組替換成分記錄的定義,而不是添加列添加記錄。
class Ingredients(models.Model):
class TYPE:
SALT = 0
PEPPER = 1
#add more here
class UNIT:
GRAM = 0
KILOGRAM = 1
LITER = 2
POUND = 3
#add more here
# an optional unit conversion
# call using Ingredients.UNIT.convert(unit1,unit2,quantity)
@staticmethod
def convert(from, to, quantity):
factor = 1
#calculate conversion factor here
....
return quantity * factor
ingredients = models.ForeignKey(Product, related_name = 'ingredients',
on_delete = models.CASCADE, null=True)
#an Ingredients.TYPE member. For example Ingredients.TYPE.SALT
type = models.IntegerField(default=0)
#an Ingredients.UNIT memeber. For example Ingrediens.UNIT.GRAM
unit = models.IntegerField(default=0)
quantity = models.IntegerField(default=0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.