Django点击添加文本字段

时间:2012-04-18 22:30:10

标签: django json forms simplejson

我正在写一个django食谱网站,并且有关于JSON字段和表单的问题

我正在尝试为网站编写创建配方功能,并希望做两件事:

  1. 我想在鼠标点击时添加文本字段,类似于添加带电子邮件的附件。我想使用JSONField这样做(除非picklefield更好)

  2. 我希望用户能够在一个文本字段中编辑配方。 我希望我可以将所有步骤打包到一个文本字段中,并允许他们编辑该字段,然后将它们解压缩回步骤。否则,用户必须编辑每个步骤可能会让人感到困惑。

  3. 这是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

1 个答案:

答案 0 :(得分:0)

您可以在此处使用formset。在您的情况下 - 取django-jsonfielddjango-picklefield以避免手动转换为对象保存和检索的数据,并创建一个在init上提供空列表的formset。

您可以使用js在客户端操作它,但不要忘记在TOTAL_FORMS隐藏输入中增加表单计数。在发布表单并清理数据后,您将拥有formset.cleaned_data(),您无需进行任何处理即可将其放入PickleField(如果您需要,可以将字段中的数据设置为initial。编辑食谱。)

相关问题