簡體   English   中英

Django 用戶如何從模板向 model 添加新屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM