我正在写一个django食谱网站,并且有关于JSON字段和表单的问题
我正在尝试为网站编写创建配方功能,并希望做两件事:
我想在鼠标点击时添加文本字段,类似于添加带电子邮件的附件。我想使用JSONField这样做(除非picklefield更好)
我希望用户能够在一个文本字段中编辑配方。 我希望我可以将所有步骤打包到一个文本字段中,并允许他们编辑该字段,然后将它们解压缩回步骤。否则,用户必须编辑每个步骤可能会让人感到困惑。
这是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 :(得分:0)
您可以在此处使用formset。在您的情况下 - 取django-jsonfield或django-picklefield以避免手动转换为对象保存和检索的数据,并创建一个在init上提供空列表的formset。
您可以使用js在客户端操作它,但不要忘记在TOTAL_FORMS隐藏输入中增加表单计数。在发布表单并清理数据后,您将拥有formset.cleaned_data()
,您无需进行任何处理即可将其放入PickleField(如果您需要,可以将字段中的数据设置为initial
。编辑食谱。)