6

私はDjangoとPythonを初めて使用し、この問題を解決するために2、3日を費やしました。ここでは他のスレッドでいくつかのアプローチを試しましたが、どれもうまくいかなかったため、いくつかの基本的な概念が欠けていると思います。これが私がやろうとしていることです:

ModelFormを使用しており、外部キーを含むレコードを追加するためのフォームを作成しました。リンク元のページに表示されたレコードと一致するように、この値をデフォルトで設定したいと思います。[以下に示すコードは、提案された修正を示すために編集されました]。

これがviews.pyからの関連するコードです:

def add_sighting(request):
unit = request.GET.get('unit')
form = SightingForm(request.POST or None, initial={'unit':unit})
if form.is_valid():
    sighting = form.save(commit=False)
    sighting.save()
    return redirect(index)
return render_to_response('trainapp/add_sighting_form.html',
                          {'unit': unit, 'sighting_form': form},
                          context_instance=RequestContext(request))

add_sighting_form.htmlの関連コードは次のとおりです。

<form action="/trainapp/add_sighting/" method="post">
{% csrf_token %}
<table>
{{ sighting_form.as_table }}
</table>
<input type="submit" value="Save" />
</form>

リンク元のテンプレートの関連コードは次のとおりです。

<p><a href="/trainapp/add_sighting/?unit={{ unit.id }}">Add sighting</a></p>
4

1 に答える 1

4

ここではいくつかのアプローチが機能する可能性があります。

最も簡単な方法は、フォームのインスタンスを作成するときに初期パラメーターを使用してから、それをビューのコンテキストに渡すことです。

次のようにviewメソッドを使用しているとします。

def some_view( request ):
    id = request.GET.get( 'record-id' )
    # do check if id is valid...

    # load some record
    record = Record.objects.get( pk=id )

    # create a form instance
    form = RecordForm( initial={ 'some_key_field_name':record.id } )

    # set up context
    context = Context({
         'record' : record,
         'form' : form
    })

    # render the templateview using the above context
    # and return a HttpResponse ...

代わりにクラスベースのビューを使用している場合は、get_context_dataをオーバーライドして同様の結果を得ることができます。

クラスベースのビュー

あなたのコードに基づいて、Djangoのクラスベースのビューを見てみることをお勧めします。は、フォームの取得と投稿を処理できます。(デフォルトの)フォームの作成も行います。

投稿されたコードに相当するものは次のようになります。

class CreateSightingView( CreateView ):

    model = Sighting

    def get_context_data( self, **kwargs ):
        # call the super to get the default context
        data = super( CreateSightingView, self ).get_context_data( **kwargs )

        # add the initial value here
        # but first get the id from the request GET data
        id = self.request.GET.get( 'record-id' )
        # again: do some checking of id
        data.get( 'form' ).initial[ 'unit' ] = id

        return data
于 2012-10-10T22:25:04.017 に答える