【问题标题】:Django - pass value from template to views functionDjango - 将值从模板传递到视图函数
【发布时间】:2020-06-08 14:18:18
【问题描述】:

我是 Django 初学者,遇到了一个我不确定如何解决的问题。 我正在建立电子商务网站来练习。我有两个主要模型:产品,项目。 产品具有价值的地方 - 内存、颜色、代码、可用性等。项目是多个产品的包装器,因此它是用户对包装成一个产品的视图。

即:

产品:手机 128GB 白色;手机64GB黑色;...

项目:手机(同时保留 128GB 白色和 64GB 黑色“指针”)

所以作为我的 ItemDetailView(DetailView) 我向用户展示一个项目,当然可以显示所有可能的颜色和内存变体。但我无法弄清楚的是如何在用户选择之后,例如通过单选按钮,在 template.html 页面中,颜色和内存将选择的变体发送到后端(或 views.py,如果我正确理解概念)。

我的想法是创建模型“ChosenProduct”,其中包含“user”、“color”、“memory”、“item”等列。因此,在选择了颜色和内存之后,理想情况下,我可以创建新对象,保存所有四个参数。有了它,我可以向用户展示它的可用性,然后单击“添加到购物车”btn 将其添加到购物车......

但问题是,我不知道如何轻松地将用户从 template.html 中选择的那些参数(颜色、大小)传递给处理此问题的实际函数。

models.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 传递参数(因为这是我理解的唯一选项)。

谢谢!

【问题讨论】:

    标签: python django django-models django-views django-templates


    【解决方案1】:

    您认为不应使用 URL 发布数据是正确的。 我假设您了解 django 表单。如果没有,请查看此django form documentation。 现在您想要的是在您的详细信息模板中呈现一个表单,该表单将包含您的所有选项以及其他选项。客户将提交带有添加到购物车按钮或购买按钮的表单。通过提交此表单,客户会将所有选择的选项发送到您的 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 并且也没有使用任何类型的前端框架。 !!我希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      这可能对您有所帮助。把它写在你的观点上并指向它的网址

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

      【讨论】:

      • 感谢您的快速回答!但是,在选择所需的产品组合后,这是否可以在不重定向前端用户的情况下工作?我想避免使用 url 并在单击按钮/radio-btn 重定向用户或刷新页面后进行渲染。
      猜你喜欢
      • 2015-07-07
      • 2018-02-10
      • 2020-08-09
      • 2021-02-03
      • 2020-03-19
      • 2019-02-16
      • 1970-01-01
      • 2015-09-18
      • 2013-07-29
      相关资源
      最近更新 更多