将变量传递回模板并更新下拉框值

时间:2019-02-12 12:36:25

标签: django

我有一个博客,想添加一个post_type变量,该变量将是网页上的下拉列表。

我已将post_type作为Charfield添加到Post模型中。并在模板中设置下拉菜单。 (这可能不是最好的方法)

它在我创建帖子以及编辑帖子时都有效,如果更改下拉值,则会保存新值。我遇到的问题是编辑帖子时,无法在下拉菜单中选择要选择的值。

我认为下拉列表中的值的html标签需要被市场选中,但我不知道该怎么做。如果有人能指出正确的方向,我将非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

最简单的方法是将选择列表添加到模型中的charfield中。

model.py

class BlogPost(models.Model):
    POST_TYPE_CHOICES = (
        ('cooking', 'Cooking'),
        ('story','Amazing Stories'),
    )
    #other fields here
    post_type = models.CharField(choices=POST_TYPE_CHOICES, max_length=50)

然后,如果您使用此模型创建ModelForm,则模板中的默认布局将是一个下拉列表。

来自文档:

  

选择

     

Field.choices

     

由以下组成的可迭代对象组成的可迭代对象(例如列表或元组)   恰好有两个项目(例如[(A,B),(A,B)...])可用作选择   这个领域。如果给出选择,则通过模型验证来实施   并且默认的表单小部件将是带有这些选择的选择框   而不是标准文本字段。

编辑了20/02:

您需要在实例内部传递实例(我假设您没有使用基于类的视图)。

所以您应该有这样的东西:

def edit_post(request, post_id):
    #try to get the instance of the post you need to edit
    post_instance = get_object_or_404(Post, id = post_id)
    #get your form and pass it the current Post instance
    form = EditPostForm(request.POST or None, instance=post_instance)
    #validate your form
    if form.is_valid():
        #if using ModelForm the database will be saved as well 
        form.save()
    #then render your template with the form
    return render(request, "edit_post.html", {'form': form})

然后,您应该在模板中使用{{form.field_name}}表示法,并且可以看到带有下拉菜单的当前值。