Python Django-将值从模板传递到视图函数

Python Django-将值从模板传递到视图函数,python,django,django-models,django-views,django-templates,Python,Django,Django Models,Django Views,Django Templates,我是一个Django初学者,遇到了一个我不确定如何解决的问题。 我正在建立电子商务网站进行实践。我有两个主要的型号:产品,项目。 其中产品具有价值-内存、颜色、代码、可用性等。Item是多个产品的包装器,因此它是用户对多个产品包装成一个产品的视图 i、 e: 产品:手机128GB白色;手机64GB黑色 项目:移动电话(保留128GB白色和64GB黑色“指针”) 因此,当我向用户显示ItemDetailView(DetailView)时,当然可以显示所有可能的颜色和内存变量。但我无法弄清楚的是,在

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

i、 e:

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

项目:移动电话(保留128GB白色和64GB黑色“指针”)

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

我的想法是创建一个模型“ChosenProduct”,上面有“用户”、“颜色”、“记忆”、“物品”等栏目。所以,在选择了颜色和内存之后,理想情况下,我可以创建新对象,保存所有四个参数。有了它,我可以向用户显示它的可用性,然后单击“添加到购物车”btn将其添加到购物车

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

models.py

views.py(DetailView)

你能告诉我正确的方向和如何使用Django处理这个操作吗?我发现多个线程在讨论request.GET,但我不想通过URL传递参数(因为这是我唯一了解的选项)


谢谢大家!

这可能会对你有所帮助。在你的视图上写下这个,并指向它的url

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

您认为不应该使用URL发布数据是正确的。 我假设你了解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>
#views.py
类ItemDetailView(successessagexin,generic.DetailView):
模板名称='product.html'
queryset=models.Item.objects.all()
def获取上下文数据(自身,**kwargs):
context=super()。获取上下文数据(**kwargs)
上下文['title']=“产品详细信息:”
上下文['item_form']=forms.AddtoCart(instace=self.object)#*或使用其他方式将初始值或默认值传递给表单
返回上下文
#forms.py
类AddToCart(forms.ModelForm):
itemCode=forms.CharField(widget=forms.HiddenInput())
itemoption=forms.BooleanField(label='Name',required=True,
widget=forms.CheckboxInput(
属性={
“占位符”:“选项在此处”
}
))
#等
类元:
模型=选择项目
字段=['itemCode','itemoption']
#排除=['Inputer'、'updater'、'updateOn']
#product.html
#为了简洁起见跳过了一些代码
{%csrf_令牌%}
{{item_form.as_p}
添加到购物车
所有这些都假设您没有使用drf,也没有使用任何类型的前端框架。
!!我希望这有帮助

谢谢你的快速回答!但,在选择了所需的产品组合后,在不重定向前端用户的情况下,这会起作用吗?我想避免在点击按钮/单选btn重定向用户或刷新页面后使用URL和渲染。
from django.shortcuts import render
def indexw(request):
    context_variable = ''
    context = {"context_variable": context_variable}
    return render(request,'index.html', context)
#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>