0

我很难为我的问题找出正确的逻辑,我有 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,我想获得单选按钮的值及其属性。它有点棘手。

4

2 回答 2

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() 让用户选择一项。但为什么要使用单选按钮?如果一个 Item 与一个 Option 有关系,那么 Item 模型应该有一个 foreignKey 而不是 M2M!

形式:

class ItemForm(ModelForm):
    options = forms.ChoiceField(widget=forms.RadioSelect())
    class Meta:
        model = Item
        fields = ( 'options', )

看法:

从 django.shortcuts 导入渲染 从 django.http 导入 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

于 2013-08-20T02:28:34.937 回答
0

在您的模板中,您可以简单地呈现价格。我会在Item模型中编写一个方法,OptionalItems以您喜欢的方式格式化。

IE

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 %}
于 2013-08-19T21:09:25.543 回答