如何在Django中用数据库存储的值自动填充表单模板?

2 投票
2 回答
9412 浏览
提问于 2025-04-30 20:51

我想把已经存储在数据库里的值填充到我的 edit_post.html 页面中。

我的编辑链接是 http://hostname/edit_Post/960 。这里的 "960" 是我数据库中某个项目的 ID。我用这个 ID 来请求更新它的内容。

我希望内容能显示在这里:

edit_Post.html

<form id="category_form" method="post" action="/edit_Post/">

    {% csrf_token %}

    {% for field in form.visible_fields %}            
        {{ field.errors }}
        <input type="text" placeholder='{{ field.help_text }}'>
    {% endfor %}

    <input type="submit" name="submit" value="Create Post" />
</form>

urls.py

url(r'^edit_Post/(?P<id>\d+)', 'blog.views.edit_Post'),

forms.py

class addPostForm(forms.ModelForm):
    title = forms.CharField(max_length=128, help_text="Please enter the title ")
    author = forms.CharField(max_length=128, help_text="Please enter the Author ")
    bodytext = forms.CharField(max_length=128,
                               help_text="Please enter the Body",
                               required=False)

    # An inline class to provide additional information on the form.
    class Meta:
        # Provide an association between the ModelForm and a model
        model=posts
        fields = ('title', 'author','bodytext')

最后是 views.py

def edit_Post(request, id):
    context = RequestContext(request)
    instance=posts.objects.get(id=id)
    form = addPostForm(instance=instance)
    if request.method == "POST":
        form = addPostForm(request.POST,instance=instance)
        if form.is_valid():
            form.save(commit=True)
            confirmation_message = "Post information updated successfully!"
            return HttpResponseRedirect('/home')
        else:
            print form.errors
    else:
        form=addPostForm(instance=instance)
    return render_to_response('edit_Post.html', {'form': form}, context)

我的 model.py

class posts(models.Model):
    author = models.CharField(max_length = 30)
    title = models.CharField(max_length = 100)
    bodytext = models.TextField()
    timestamp = models.DateTimeField(default=datetime.now, blank=True)
暂无标签

2 个回答

-1

Django 提供了CRUD(创建 -> CreateView,删除 -> DeleteView,更新 -> UpdateView,详情 -> DetailView)视图。如果可以的话,尽量使用这些视图。
你可以在一个类的 views.py 文件中修改你的方法。

class PostDetail(DetailView):
    model = posts
    form_class = addPostForm
    template = "edit_post.html"

然后你可以在这里添加方法哦 :)。

1

Django 本来会自动处理这个问题,如果你没有绕过它输出字段的机制。在你的模板中,你应该这样做:

{% for field in form.visible_fields %}
    {{ field.errors }}
    {{ field }}
{% endfor %}

如果你想保留占位符的功能,可以在表单类里面添加这个:

class addPostForm(forms.ModelForm):
    title = forms.CharField(max_length=128, widget=forms.TextInput(attrs={'placeholder': 'Please enter the title'}))

撰写回答