我很难找到问题的正确逻辑,我有3个模型,
class Item(SmartModel):
name= models.CharField(max_length=64,help_text="Name for this item e.g Hamburger")
price=models.DecimalField(max_digits=9,decimal_places=2)
optionalitems = models.ManyToManyField('optionalitems.OptionalItemCategory',null=True,blank=True)
class OptionalItems(SmartModel):
"""Optional items that belong to an item e.g topping that belongs to a pizza"""
name = models.CharField(max_length=20, help_text="Item name.")
price = models.DecimalField(max_digits=9, decimal_places=2, null=True,blank=True)
class OptionalItemCategory(SmartModel):
"""Category to which optional items belong"""
title = models.CharField(max_length=20,help_text="Category name")
optional_items = models.ManyToManyField(OptionalItems)
在我的模板中,
{%for optionalcategory in optionalcategories %}
<h5 id="blah"> {{ optionalcategory.title}} </h5>
{% for optionalitem in optionalcategory.optional_items.all %}
<ul>
<input type="radio" value="radio" name="optional" value="op"><li id="item_appearence">{{optionalitem.name}}<span> {{optionalitem.price}}</span></li><a/>
</ul>
{% endfor %}
{% endfor %}
例如,像墨西哥卷饼一样的Item
会有OptionalItem
牛排或鸡肉。我可以像Item
一样访问item = get_object_or_404(Item, pk=obj.id)
但我的问题是我无法弄清楚如何捕获OptionalItem
。我希望能够访问OptionalItem
,我想获得单选按钮及其属性的值。它有点棘手。
答案 0 :(得分:0)
在模板中,您只需渲染价格即可。我在Item
模型中编写了一个方法,以您希望的方式格式化OptionalItems
。
即
class Item(SmartModel)
...
def get_optional(self):
return ','.join([a.optionalitems for a in self.optionalitems.all()])
当然,您应该更改该方法,使其按照您希望的方式进行格式化。
如果您将Items
的查询集传递给模板,则可以执行以下操作:
{% for item in items %}
Name: {{ item.name}}
Price: {{ item.price }}
Optional Items: {{ item.get_optional }}
{% endfor %}
答案 1 :(得分:0)
您的代码不一致,这使您难以阅读,理解和使用。一些建议,清理它。像这样:
class Category(models.Model):
name = models.CharField(max_length=200)
class Option(models.Model):
name = models.CharField(max_length=200)
price = models.DecimalField(max_digits=9, decimal_places=2, blank=True, null=True)
class Item(models.Model):
category = models.ForeignKey(Category)
name = models.CharField(max_length=200)
price = models.DecimalField(max_digits=9, decimal_places=2, blank=True, null=True)
options = models.ManyToManyField(Option)
比你需要一个来自和一个视图。在我解释您的问题时:您希望表单为项目选择一个选项。因此,下面的代码将呈现所有选项和小部件RadioSelect()允许用户选择一个项目。但为什么要使用radiobuttons?如果一个Item与一个Option有关系,那么Item模型应该有一个foreignKey而不是M2M!
形式:
class ItemForm(ModelForm):
options = forms.ChoiceField(widget=forms.RadioSelect())
class Meta:
model = Item
fields = ( 'options', )
查看:
来自django.shortcuts导入渲染 来自django.http import HttpResponseRedirect
def your_view(request, id):
item = Item.objects.get(pk=id) # Your item object.
if request.method == 'POST': # If the form has been submitted...
form = ContactForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data
options = form.cleaned_data['options']
# ...
return HttpResponseRedirect('/thanks/') # Redirect after POST
else:
form = ArticleForm(instance=article)
return render(request, 'contact.html', {
'form': form,
})
模板:
{% for obj in item.options_set.all %}
{{ obj.name }} {{ obj.price }}
{% endfor %}
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
我不测试代码。但这应该让你开始。文档是你的朋友: https://docs.djangoproject.com/en/1.5/topics/forms/ https://docs.djangoproject.com/en/1.5/#forms