0

我有以下 Django 表单:

class PageForm(forms.Form):
    title = forms.CharField(max_length=50)
    image  = forms.ImageField(required=False)
    content = forms.CharField(widget=forms.Textarea(attrs={'cols':20, 'rows':10}))

我正在使用它从给定模板创建新页面。但现在我还想添加编辑的可能性,所以我想使用表单来呈现相同的模板,只使用一些从页面 id 检索的默认值。这就是我所拥有的:

page_to_edit = Page.objects.filter(id=page_id)[0] // Get page from model
title = page_to_edit.title
content = page_to_edit.content
picture = page_to_edit.picture.order_by('?')[0].file // Here file is a models.ImageField
initial_data = {'title' : title, 'content' : content, 'image' : picture}
form = PageForm(initial_data) 
// Finally return this form to template

现在这可以像我想要的标题和内容一样工作,并且这些在模板中正确呈现并具有初始值,但 ImageField 只是空的。我也尝试过传递图片.url 而不是图片,但没有变化。

任何帮助,将不胜感激。

一切顺利

4

1 回答 1

1

我将通过以下方式解决此问题:

  1. 您可以使用.get()来检索单个记录,Page.objects.get(pk=page_id)而不是.filter()返回查询集。还有一个快捷方式 get_object_or_404可以为您采用将 a 包装.get()try..except块中的常见模式。如果未找到模型,则改为返回 HTTP 404 页面。
  2. 改用ModelForm
  3. AModelForm接受instance现有模型的参数,因此您无需设置初始值。

考虑到这些事情,您的代码最终会看起来像这样:

# forms.py
from django import forms

class PageForm(forms.ModelForm):
    class Meta:
        model = Page
        fields = ('title', 'image', 'content')

# views.py
from django.shortcuts import render, get_object_or_404

def edit_page(request, page_id):
    page = get_object_or_404(Page, pk=page_id)

    if request.method == 'POST':
        form = PageForm(instance=page, request.POST)

        if form.is_valid():
            form.save()
    else:
        form = PageForm(instance=page)

    return render(request, 'some_template.html', {'form': form})

def create_page(request):
    if request.method == 'POST':
        form = PageForm(request.POST)

        if form.is_valid():
            form.save()
    else:
        form = PageForm()

    return render(request, 'some_template.html', {'form': form})

# urls.py
(r'^page/create/$', views.create_page, 'create_page'),
(r'^page/edit/(?P<page_id>\d+)/$', views.edit_page, 'edit_page'),
于 2013-05-26T12:40:58.263 回答