2015-02-25 5 views
7

मेरे पास एक पोस्ट फॉर्म वाला एक पृष्ठ है, जिसमें कुछ यूआरएल पर एक क्रिया सेट है।
यानी मान यह पेज यूआरएल /form_url/ है: .. पोस्ट फॉर्म के बाद django डिस्प्ले संदेश सबमिट करें

/submit_url/ में दृश्य प्रपत्र डेटा का ख्याल रखना। इसके बाद, मैं एक सफल संदेश के साथ फॉर्म के उसी पृष्ठ को वापस करना चाहता हूं। POST फॉर्म की देखभाल करने वाले दृश्य में, मैं ब्राउज़र से फ़ॉर्म डेटा को "साफ़" करने के लिए HttpResponseRedirect का उपयोग करता हूं। लेकिन इस तरह से मैं फॉर्म पेज में एक संदेश प्रदर्शित नहीं कर सकता, जब तक कि मैं कुछ ऐसा कार्य करें:

return HttpResponseRedirect("/form_url/?success=1") 

और फिर टेम्पलेट में इस पैरामीटर के लिए जाँच करें। मुझे इस तरह से पसंद नहीं है, क्योंकि यदि उपयोगकर्ता पृष्ठ को रीफ्रेश करता है, तो वह अब भी सफलता संदेश देखेगा।

मैंने देखा है कि django व्यवस्थापक साइट में, ऑब्जेक्ट्स का डिलीट/ऐड POST सबमिट करने के बाद रीडायरेक्ट का उपयोग करता है, और फिर भी किसी भी तरह का सफलता संदेश प्रदर्शित करता है। कैसे?

मैं पहले से ही कुछ समय के लिए Django देखा है एप्लिकेशन "संदेश", लेकिन मुझे पता है कि यह कैसे पहली बार काम करना चाहता हूँ ..

उत्तर

5

Django संदेशों ढांचे सत्र या कुकी (यह storage backend पर निर्भर करता है) में संदेशों संग्रहीत करता है।

+0

समझा। मुझे ऐसा लगा। मैं सत्र का उपयोग किए बिना ऐसा करने की कोशिश कर रहा हूं। – user3599803

2

आपको फ़ॉर्म डेटा को साफ़ करने के लिए रीडायरेक्ट करने की आवश्यकता नहीं है। उपयोगकर्ता को पृष्ठ रीफ़्रेश

def your_view(request): 
    form = YourForm(request.POST or None) 
    success = False 
    if request.method == 'POST': 
     if form.is_valid(): 
      form.save() 
      form = YourForm() 
      success = True 
    return render(request, 'your_template.html', {'form': form}) 

हैं, वे किसी GET अनुरोध को आरंभ करने जा रहे हैं, और successFalse होगा: आपको बस इतना करना है की जरूरत है विधि को पुनः का दृष्टांत। किसी भी तरह से, फॉर्म जीईटी, या एक सफल पोस्ट पर अनबाउंड होगा।

यदि आप messages framework का लाभ उठाते हैं, तो आपको संदेशों को प्रदर्शित करने के लिए टेम्पलेट में एक सशर्त जोड़ने की आवश्यकता होगी यदि वे मौजूद हैं या नहीं।

+3

यदि मैं POST द्वारा अपेक्षित दृश्य से प्रतिक्रिया वापस करने के लिए रेंडर() का उपयोग करता हूं, तो यदि उपयोगकर्ता पृष्ठ को रीफ्रेश करता है तो ब्राउज़र फिर से फ़ॉर्म भेजने के लिए पॉपअप को संकेत देगा। यही वह है जिसे मैं टालने की कोशिश कर रहा हूं। – user3599803

+0

आप वास्तव में यहाँ कोई विकल्प नहीं है। आपको या तो रीडायरेक्ट जारी करने और क्वेरीस्ट्रिंग पैरामीटर को पास करने की आवश्यकता है, या आपको एक संदेश/सत्र मान का उपयोग करने की आवश्यकता है। – Brandon

+0

क्या django संदेश ऐप उपयोग किए जाने के बाद सत्र डेटा साफ़ करता है? चूंकि इसे प्रदर्शित करने के बाद सत्र को सहेजने की कोई आवश्यकता नहीं है। – user3599803

4

Django व्यवस्थापक django.contrib.messages का उपयोग करता है, तो आप इसे इस तरह का उपयोग करें:

आपके विचार में:

from django.contrib import messages 

def my_view(request): 
    ... 
     if form.is_valid(): 
      .... 
      messages.success(request, 'Form submission successful') 

और अपने टेम्पलेट में:

{% if messages %} 
<ul class="messages"> 
    {% for message in messages %} 
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
    {% endfor %} 
</ul> 
{% endif %} 
0
from django.contrib.messages.views import SuccessMessageMixin 
from django.views.generic.edit import CreateView 
from myapp.models import Author 

class AuthorCreate(SuccessMessageMixin, CreateView): 
    model = Author 
    success_url = '/success/' 
    success_message = "%(name)s was created successfully" 

https://docs.djangoproject.com/en/1.11/ref/contrib/messages/

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