django表单默认为ImageField进行渲染

时间:2013-05-26 11:58:25

标签: python django

我有以下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只是空的。我也试过传递picture.url而不是图片,但没有变化。

任何帮助都将不胜感激。

一切顺利

1 个答案:

答案 0 :(得分:1)

我会按以下方式处理:

  1. 您可以使用.get()来检索单个记录Page.objects.get(pk=page_id),而不是.filter(),它会返回一个查询集。还有一个shortcut get_object_or_404采用了一种将.get()包裹到try..except块中的常见模式。如果找不到模型,则返回HTTP 404页面。
  2. 使用ModelForm instead
  3. ModelForm接受现有模型的instance参数,因此您无需设置初始值。
  4. 考虑到这些事情,您的代码最终会看起来像这样:

    # 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'),