簡體   English   中英

Django - 將值從模板傳遞給視圖函數

[英]Django - pass value from template to views function

我是 Django 初學者,遇到了一個我不確定如何解決的問題。 我正在建立電子商務網站來練習。 我有兩個主要模型:產品、項目。 Product 具有價值的地方 - 內存、顏色、代碼、可用性等。Item 是多個產品的包裝器,因此它是用戶將多個產品包裝成一個的視圖。

IE:

產品:手機128GB白色; 手機64GB黑色;...

項目:手機(保留128GB白色和64GB黑色“指針”)

因此,當我的 ItemDetailView(DetailView) 向用戶顯示一個 Item 時,當然可以顯示所有可能的顏色和內存變體。 但我無法弄清楚的是如何在用戶選擇后實際如何,例如通過單選按鈕,在 template.html 頁面中,顏色和內存將選擇的變體發送到后端(或 views.py,如果我正確理解概念)。

我的想法是創建模型“ChosenProduct”,其中包含“user”、“color”、“memory”、“item”等列。 所以在選擇顏色和內存后,理想情況下,我可以創建新對象,保存所有四個參數。 有了它,我可以向用戶展示它的可用性,然后單擊“添加到購物車” btn 將其添加到購物車...

但問題是,我不知道如何輕松地將用戶從 template.html 中選擇的那些參數(顏色、大小)傳遞給處理此問題的實際函數。

模型.py

#presenting actual Product for sale
class Product(models.Model):
    code = models.CharField(max_length=30)
    colorCode = models.CharField(max_length=20, blank=True, null=True)
    rgb = models.CharField(max_length=20, blank=True, null=True)
    sizeCode = models.CharField(max_length=20, blank=True, null=True)
    avalibility = models.IntegerField(default=0)

    def __str__(self):
        return self.code


#wraps multiple Products
class Item(models.Model):
    title = models.CharField(max_length=100)
    description = models.CharField(max_length=10000)
    price_inclVat = models.FloatField()
    price_noVat = models.FloatField()
    price_discount_inclVat = models.FloatField(blank=True, null=True)
    price_discount_notVat = models.FloatField(blank=True, null=True)
    products = models.ManyToManyField(Product)
    slug = models.SlugField()
    label = models.CharField(choices=LABEL_CHOICES,
                             max_length=1, null=True, blank=True)


#my idea of presenting chosen variants in user's relation
class ChosenProduct(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    color = models.CharField(max_length=20, blank=True)
    size = models.CharField(max_length=20, blank=True)
    item = models.ForeignKey(Item, on_delete=models.CASCADE)

    def __str__(self):
        return self.item.title

views.py (DetailView)

class ItemDetailView(DetailView):
    model = Item
    template_name = "product.html"

您能否指出正確的方向以及如何使用 Django 處理此操作? 我發現多個線程討論 request.GET 但我不想通過 URL 傳遞參數(因為這是我理解的唯一選項)。

謝謝!

您認為不應使用 URL POST 數據是正確的。 我假設您了解 Django 表單。 如果沒有,請查看此django 表單文檔 現在您想要的是在您的詳細信息模板中呈現一個表單,該表單將包含您的所有選項以及不包含的內容。 客戶將提交帶有添加到購物車按鈕或購買按鈕的表單。 通過提交此表單,客戶會將所有選擇的選項發送到您的 django 后端。

#views.py
class ItemDetailView(SuccessMessageMixin, generic.DetailView):
    template_name = 'product.html'
    queryset = models.Item.objects.all()
    
   def get_context_data(self, **kwargs):
      context = super().get_context_data(**kwargs)
      context['title'] = "Details of Product: "
      context['item_form'] = forms.AddtoCart(instace=self.object)#* or use other ways to pass initial or default value to form
      return context

#forms.py
class AddToCart(forms.ModelForm):
   itemCode = forms.CharField(widget=forms.HiddenInput())
   itemoption = forms.BooleanField(label='Name', required=True, 
          widget=forms.CheckboxInput(
             attrs={
                     'placeholder': 'options are here '
                   }
            ))
 #etc


class Meta:
    model = Choosen_Item
    fields = ['itemCode', 'itemoption' ]
    # exclude = ['inputter', 'updater', 'updateOn']

#product.html
# skipped some code for brevity
<form action='url to where you want to process the submitted data'>
 {% csrf_token %}
 {{ item_form.as_p}}
 <button>Add to cart</button>
</form>

所有這些都假設您沒有使用 drf,也沒有使用任何類型的前端框架。 !!我希望這有幫助!!

這可能對你有幫助。 把這個寫在你的觀點上並指向它的網址

from django.shortcuts import render
def indexw(request):
    context_variable = ''
    context = {"context_variable": context_variable}
    return render(request,'index.html', context)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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