2012-04-18 108 views
0

我寫一個Django的食譜網站添加文本框,並有一個關於JSON領域的問題,並形成的Django上點擊

我試圖寫該網站的創建配方功能,並希望做兩件事情:

  1. 我想在鼠標單擊文本字段添加類似於添加帶有電子郵件附件。我想用JSONField這樣做(除非picklefield越好)

  2. 我希望用戶能夠在一個文本框來編輯配方。 我希望我可以將所有步驟打包到一個文本字段中,並允許他們編輯該字段,然後將其解壓縮回步驟中。否則可能會讓用戶不得不編輯每個單獨的步驟而感到困惑。

這裏是從Django項目我的模型:

class Cookbook(models.Model): 
    def __unicode__(self): 
     return self.name 
    name = models.CharField(max_length=50) 
    pub_date = models.DateTimeField('date published') 
    user = models.ForeignKey(User, related_name='cookbooks') 
    recipes = models.ManyToManyField('Recipe', related_name = 'cookbooks') 


class Recipe(models.Model): 
    def __unicode__(self): 
     return self.name 
    original_cookbook = models.ForeignKey(Cookbook) 
    name = models.CharField(max_length=200) 
    author = models.CharField(max_length= 100) 
    picture = models.ImageField(upload_to = 'Downloads', blank=True) 
    pub_date = models.DateTimeField('date published', auto_now_add=True, blank=True) 
    ingredients = JSONField() 
    steps = JSONField() 
    prep_time = models.IntegerField() 

下面是我在其中創建新配方的看法。現在我不確定如何在我的視圖中使用JSONField。

,我發現這個link但它指出:「最後,我不知道如何與形式又相互作用,使得境界是有點模糊。」看到我正在使用表格,這個問題解決了嗎?

def createrecipe(request): 
    if not request.user.is_authenticated(): 
     return HttpResponseRedirect('/index/') 
    else: 
     if request.method == 'POST': 
      form = RecipeForm(request.POST) 
      if form.is_valid(): 
       recipe = form.save(commit=False) 
       recipe.original_cookbook = request.user.cookbooks.all()[0] 
       recipe.pub_date = datetime.datetime.now() 
       recipe.save() 
       user = request.user 
       cookbooks = user.cookbooks 
       cookbook = cookbooks.all()[0] 
       cookbook.recipes.add(recipe) 
       return HttpResponseRedirect('/account') 
     else: 
      form = RecipeForm() 

     return render_to_response('cookbook/createrecipe.html', 
            {'form':form}, 
           context_instance=RequestContext(request)) 

這裏是createrecpe.html嵌段含量:

{% block content %} 
    <form action="." method="POST"> 
     <table> 
      {% csrf_token %} 
      {{ form.as_table }} 
     </table> 
     <p><input type="submit" value="Submit"></p> 
    </form> 
{% endblock %} 

我有一個很難橋接JSONField模型,並顯示/文本輸入到JSON字段的視圖之間的間隙。我也很困惑如何在模板中顯示jsonfield。

感謝您的幫助這真令人沮喪我,

snackerfish

+0

有益的,如果你顯示/說明到目前爲止,你已經得到了模型。 – 2012-04-18 22:37:10

+0

謝謝@benauthor我已經添加了模型 – snackerfish 2012-04-19 01:29:07

回答

0

您可以使用formset這裏。在你的情況 - 採取django-jsonfielddjango-picklefield避免手工從數據上對象的保存和檢索轉換爲/,並創建一個表單集提供的初始化空列表。

可以使用JS操縱它在客戶端,但不要忘記遞增形式隱藏輸入TOTAL_FORMS計數。發佈表格並清理數據後,您將擁有formset.cleaned_data(),您可以將其放入PickleField中,而無需任何附加處理(如果需要編輯配方,則可以將字段數據作爲initial進行排版)。

+0

所以如果我想使用json的recipe_ingredients我只會使用JsonField而不是TextField?還是我必須做一個JSON字段和文本字段添加到JSON場 感謝@ilvar這似乎完美 – snackerfish 2012-04-19 16:52:48

+0

我想通了如何設置JSON,但現在我在我的模板 得到一個錯誤**抓到ValueError渲染時:沒有JSON對象可以解碼** 我需要解壓縮json或在我的模板中的東西嗎? – snackerfish 2012-04-19 17:25:18

+0

JSON字段返回一個Python對象(通常是字典或列表),你的問題在數據庫中是錯誤的,它是一些但不正確的JSON。也許你在這個領域出了問題。你是如何填充它的?你在該領域的數據庫中有哪些數據? – ilvar 2012-04-20 03:38:33