如何在django中访问和使用html数据?

时间:2013-08-19 21:02:35

标签: html django

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

2 个答案:

答案 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