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 は空です。また、picture.urlの代わりにpicture.urlを渡そうとしましたが、変更はありません。

どんな助けでも大歓迎です。

ではごきげんよう

4

1 に答える 1

1

私はこれに次のようにアプローチします。

  1. クエリセットを返す代わりに、を使用.get()して単一のレコードを取得できます。a をブロックにラップする一般的なパターンを使用するショートカットもあります。モデルが見つからない場合は、代わりに HTTP 404 ページが返されます。Page.objects.get(pk=page_id).filter() get_object_or_404.get()try..except
  2. 代わりに ModelForm を使用してください
  3. は既存のモデルModelFormのパラメーターを受け入れる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 に答える