2009-10-16 17 views
11

तो यह बहुत कठिन नहीं किया जा सकता लेकिन मैं इसे समझ नहीं कर सकते हैं ...Django रूप रीडायरेक्ट का उपयोग कर HttpResponseRedirect

मैं Django (/file_upload/ में स्थित) में अपने प्रपत्र चाहते हैं एक फ़ाइल अपलोड करने , इसे डेटाबेस में जोड़ें, और उसके बाद एक नए पृष्ठ पर रीडायरेक्ट करें जहां पैरामीटर उस क्षेत्र की आईडी है जिसे मैंने डेटाबेस में जोड़ा है (/फ़ाइल/163/ पर स्थित है)।

मैं इतना है कि /फ़ाइल/163/ काम करता है ठीक है अगर तुम वहाँ सीधे नेविगेट urls.py सेट कर लेते हैं, लेकिन मैं कैसे /फ़ाइल/अपलोड/ से वहाँ पहुँचने के लिए पता नहीं है।

मेरे कोड इस तरह है:

def add(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = UploadFileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      # do stuff & add to database 
    my_file = FileField.objects.create() 
      return HttpResponseRedirect(reverse('/file/', args=[my_file.id])) 

मैं this solution उपयोग नहीं कर सकते क्योंकि मैं नहीं जानता कि क्या क्षेत्र आईडी जब तक मैं views.py में प्रपत्र संभाला है होने जा रहा है, इसलिए figures.py में रीडायरेक्ट होना है। मुझे लगता है।

कोई विचार? में

return HttpResponseRedirect(reverse('/file/', args=[my_file.id])) 

reverse एक दृश्य या नाम या एक दृष्टिकोण लेता reverse गलत करने के लिए

def add(request): 
    if request.method == 'POST': 
     form = UploadFileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      # do stuff & add to database 
      my_file = FileField.objects.create() 
      # use my_file.pk or whatever attribute of FileField your id is based on 
      return HttpResponseRedirect('/files/%i/' % my_file.pk) 
    else: 
     form = UploadFileForm() 

    return render_to_response('upload_file.html', { 
     'form': form, 
    }) 

उत्तर

10

प्रपत्र के साथ अपने दृश्य कुछ इस तरह दिखना चाहिए यूआरएल नहीं

आप कहते हैं कि नहीं कि आपका दृश्य समारोह फ़ाइल को देखने के लिए कहा जाता है, लेकिन देता है कहते हैं कि यह view कहा जाता है, तो ऊपर होना चाहिए

return HttpResponseRedirect(reverse('view', args=[my_file.id])) 

या शायद

return HttpResponseRedirect(reverse(view, args=[my_file.id])) 

निर्भर करता है आपने urls.py

पर जो लिखा है उस पर आप urls.py में विचारों का नाम दे सकते हैं और फ़ंक्शन नामों के बजाय उन नामों का उपयोग कर सकते हैं- see the documentation for more examples

रिवर्स का उपयोग करना एक अच्छा विचार है यदि आप अपने urls.py को शफल करना पसंद करते हैं - आप किसी भी पथ को बदलने में सक्षम होंगे और आपके सभी विचार केवल काम करते रहेंगे।

+0

सही। धन्यवाद – AP257

+1

@ रिचर्ड - नोट निक क्रेग-वुड की टिप्पणी - आप अपने विचारों में हार्ड-कोडिंग यूआरएल की तुलना में 'रिवर्स' का उपयोग करके बेहतर हो सकते हैं। –

20

आप तर्क मिल गया है,:

+1

+1, रिवर्स जीवन को आसान बनाता है। –

1

या आप बस redirect(to[, permanent=False], *args, **kwargs) शॉर्टकट फ़ंक्शन का उपयोग कर सकते हैं: एक मॉडल वस्तु गुजर (यदि मॉडल get_absolute_url विधि परिभाषित किया गया है) द्वारा

  1. , आपके मामले में तो:

    my_file = FileField.objects.create() 
    return redirect(my_file)
  2. द्वारा एक दृश्य नाम और कुछ स्थितित्मक और कीवर्ड तर्कों को पारित करना, आपके मामले में:

    my_file = FileField.objects.create() 
    return redirect('file', my_file.pk)

    या स्थितीय तर्कों का उपयोग यदि आपके url परिभाषा यह की आवश्यकता है:

    my_file = FileField.objects.create() 
    return redirect('file', file_id=my_file.pk)
  3. एक, रिश्तेदार निरपेक्ष, या पूर्ण URL पारित करके:
    my_file = FileField.objects.create() 
    return redirect('/files/%i/' % my_file.pk)
0

मुझे लगता है कि आप क्या हासिल करना चाहते हैं ठीक है Django ट्यूटोरियल क्या कदम, कदम से कदम बताते हैं। यदि आपके पास कुछ समय है, तो इसे देखें: Django Tutorialhttps://docs.djangoproject.com/en/1.6/intro/tutorial03/

संबंधित मुद्दे