2

フォーム送信から「ありがとう」ページにデータを渡す方法はありますか。私がこれをやりたい理由は、Web サイトにフォームがあり、ユーザーがすべて異なる PDF を含む複数のフィールドを選択するためです。

そのため、ユーザーがフォームを送信したら、お礼のページにリダイレクトし、フォームで選択した PDF/ファイルのリストを表示できるようにします。

これが続けるのに十分な情報であることを願っています。これが私の見解/モデルです。

def document_request(request, *args):

   # template = kwargs['name'] + ".html"

    if request.method == 'POST':
        form = forms.ReportEnquiryForm(request.POST)
        print(request.POST)

        if form.is_valid():
                docrequest = form.save()
                return HttpResponseRedirect(reverse('thank_you', kwargs={'id': docrequest.id}))

    else:
        form = forms.ReportEnquiryForm()
        return render_to_response('test.html',{'form':form})

def thank_you(request):


    docrequest = DocumentRequest.objects.get(pk=id)
    return render_to_response('thankyou.html',
                          {'docrequest' : docrequest },                            
                          context_instance=RequestContext(request))

私の最初のアイデアは、データを thank_you という新しいビューに渡すことでした。しかし、これは不可能です。

class DocumentUpload(models.Model):
    name = models.CharField(max_length="200")

    document_upload = models.FileField(upload_to="uploads/documents")


    def __unicode__(self):
        return "%s" % self.name

class DocumentRequest(models.Model):
    name = models.CharField(max_length="200")

    company = models.CharField(max_length="200")

    job_title = models.CharField(max_length="200")

    email = models.EmailField(max_length="200")

    report = models.ManyToManyField(DocumentUpload)

    def __unicode__(self):
        return "%s" % self.name

フォーム.py

class ReportEnquiryForm(forms.ModelForm):

    class Meta:
        model = models.DocumentRequest

        fields = ('name', 'company', 'job_title', 'email', 'report')

さらに情報が必要な場合は、お問い合わせください:)

4

2 に答える 2

0

Daniel Roseman が言ったように実行できますが、この場合、ID を持つ人なら誰でもサンキュー ページにアクセスできます。

ビュー間でデータを渡すいくつかの方法は次のとおりです (リストは私のものではありません)。

GET request - First request hits view1->send data to browser -> browser redirects to view2
POST request - (as you suggested) Same flow as above but is suitable when more data is involved
Using django session variables - This is the simplest to implement
Using client-side cookies - Can be used but there is limitations of how much data can be stored.
Maybe using some shared memory at web server level- Tricky but can be done.
Write data into a file & then the next view can read from that file.
If you can have a stand-alone server, then that server can REST API's to invoke views.
Again if a stand-alone server is possible maybe even message queues would work.
Maybe a cache like memcached can act as mediator. But then if one is going this route, its better to use Django sessions as it hides a whole lot of implementation details.
Lastly, as an extension to point 6, instead of files store data in some persistent storage mechanism like mysql.

最も簡単な方法は、セッションを使用することです。ID をセッションに追加して、サンキュー ビューにリダイレクトするだけで、ID 値を読み取り、その ID でデータベースにクエリを実行できます。

于 2013-10-03T13:00:49.103 に答える
0

ユーザーの送信を DocumentRequest オブジェクトに保存しました。そのため、リダイレクト時に URL でそのオブジェクトの ID を渡すことができ、thank_youビューで DocumentRequest を取得してリストをレンダリングできます。

編集アイデアは、URL からパラメーターを受け入れる他のビューのように、thank_you ページを作成することです。

url(r'thanks/(?P<id>\d+)/$, 'thank_you', name='thank_you')

したがって、フォーム ビューの POST 部分は次のようになります。

if form.is_valid():
    docrequest = form.save()
    return HttpResponseRedirect(reverse('thank_you', kwargs={'id': docrequest.id}))

そして、thank_you は次のとおりです。

def thank_you(request, id):

    docrequest = DocumentRequest.objects.get(pk=id)
    return render_to_response('thankyou.html',
                              {'docrequest' : docrequest },                            
                              context_instance=RequestContext(request))

2 回目の編集

他の人が示唆しているように、これにより誰でもリクエストを見ることができます。したがって、より良い解決策は、それをセッションに入れることです。

    docrequest = form.save()
    request.session['docrequest_id'] = docrequest.id

そしてThank_youで:

def thank_you(request):
    if not 'docrequest_id' in request.session:
        return HttpResponseForbidden    
    docrequest = DocumentRequest.objects.get(request.session['docrequest_id'])
于 2013-10-03T12:36:49.660 に答える