3

これが編集を書く最もクリーンな方法であるかどうかはわかりません。しかし、何時間もの研究の後、これは私が思いつくことができる最高のものです。ただし、実際にモデルを更新するためにPOSTとして再度取得するために、非表示フィールド内にIDを格納する必要があるという事実は好きではありません。

これを行うためのより効率的な方法はありますか?

def edit_contact_view(request):
    profile = request.user.get_profile()
    if 'id' in request.GET:
        try:
            id = request.GET['id']
            contacts = profile.company.contact_set.all()
            form = ContactsForm(profile.company, instance=contacts.get(id=id))
            form.data['id'] = id
            variables = RequestContext(request, {'form':form })
            return render_to_response("contact.html", variables)
        except Contact.DoesNotExist:
            raise Http404(_(u'Contact not found'))
    else:
        if request.method == 'POST':
            form = ContactsForm(profile.company, request.POST)
            if form.is_valid():
                contacts = profile.company.contact_set.all()
                contact = contacts.get(id=form.cleaned_data['id'])
                contact.last_name = form.cleaned_data['last_name']
                contact.save()
    return HttpResponseRedirect('/')
4

2 に答える 2

4

はい、あなたはこれを必要以上に複雑にしています。

まず、Djangoでは、GETパラメータではなく、たとえば。/contact/edit/3/ではなく、URL自体でIDを渡すのが一般的です/contact/edit?id=3。このようなURLを構成する方法については、たとえばこの質問を参照してください。

次に、どちらの方法でも、IDはURLからすでに利用可能であるため、非表示の変数でIDを渡す必要はありません。そこからいつでもインスタンスを取得できます。

第三に、それContactFormはModelFormだと思いますが、save機能を使用していないため、さらに単純化されています。

すべてを一緒に入れて:

def edit_contact_view(request, id=None):
    profile = request.user.get_profile()
    if id is not None:
        contact = get_object_or_404(Contact, pk=id)
    else:
        contact = Contact(company=profile.company)
    if request.POST:
       form = ContactForm(request.POST, instance=contact)
       if form.is_valid():
           contact = form.save()
           return redirect(...)

    else:
        form = ContactForm(instance=contact)
    return render_to_response('contact.html', {'form': form})
于 2012-06-29T18:15:46.803 に答える
2

私はここで何かが欠けているに違いありませんが、標準のようにURLでIDをエンコードしてみませんか?

すなわちurls.py

url('^/contact/?P<contact_id>[0-9]+)/edit/$', edit_contact_view, name='edit_contact_view')

あなたの見解:

def edit_contact_view(request, contact_id):
    profile = request.user.get_profile()
    contact = get_object_or_404(Contact, id=contact_id)
    if contact not in profile.company.contact_set.all():
        return Http404

とあなたのテンプレートで

<form method="POST">
   {{ form.as_p }}
   ...
</form>
于 2012-06-29T18:10:50.457 に答える