2013-08-19 16 views
0

我有一個很難搞清楚正確的邏輯,我的問題,我有3種型號,如何在django中訪問和使用html數據?

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牛排或chicken.I能夠訪問Item像這樣item = get_object_or_404(Item, pk=obj.id)但我的問題是我無法弄清楚如何捕獲OptionalItem。我希望能夠訪問OptionalItem,我想獲得單選按鈕及其屬性的值。它的一種棘手。

回答

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) 

比你需要一個和一個視圖。當我解釋你的問題時:你需要一個表單來爲一個Item選擇一個選項。因此,下面的代碼將呈現所有選項,並且小部件RadioSelect()允許用戶選擇一個項目。但爲什麼使用單選按鈕?如果一個項目與一個選項有關係,那麼項目模型應該有一個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

+0

感謝您的建議,但您的回答有點讓我進入另一個方向..我試圖實現的是能夠訪問所選的optional_item(單選按鈕)並對其進行查詢,就像item = get_object_or_404(Item,pk = obj.id) –

+0

我不明白你試圖完成什麼,我不知道你不想要另一個方向。但是你的編碼風格使得理解和使用的東西「有點棘手」。所以我開始清理東西。請提供您的表單和查看代碼。 – allcaps

+0

我明白了你的觀點,我的編碼還有很長的路要走,但這就是爲什麼我要問這裏和形式,我沒有定義表格。請告訴我如何使用表格去解決問題。 –

0

在您的模板中,您可以簡單地渲染價格。我會在Item模型中編寫一個方法,以您喜歡的方式格式化OptionalItems

class Item(SmartModel) 
    ... 
    def get_optional(self): 
     return ','.join([a.optionalitems for a in self.optionalitems.all()]) 

當然,你應該改變這種方法有它格式化您希望的方式。

如果您傳遞的Items一個QuerySet到您的模板,你可以做類似如下:

{% for item in items %} 
    Name: {{ item.name}} 
    Price: {{ item.price }} 
    Optional Items: {{ item.get_optional }} 
{% endfor %} 
+0

我可以使價格不錯,但我希望能夠獲得可選的項目對象提交後,這樣我可以在其上進行查詢。對不起,如果我的問題是誤導性的,一定是可憐的英語 –

+0

啊,對不起,沒有看到'OptionalItems'也有價格。您可以通過更改'get_optional'方法來定製它的呈現方式,以您喜歡的方式顯示它。您可以只處理'OptionalItems'類中的屬性。 –

+0

對不起,我沒有得到上面的評論,新手,但我會給它一個鏡頭。 –