2011-08-02 13 views
12

मेरे पास कक्षा QuestionView है जो FormView कक्षा से ली गई है। में इसलिए चर - मैं टेम्पलेट में इनमें से अद्यतन मूल्यों का उपयोग करने का इरादाFormView form_valid विधि में संदर्भ डेटा अपडेट कर रहा है?

class QuestionView(FormView): 
    ... 
    context_var1 = y 
    def form_valid (self, form): 
    ... 
    self.context_var1 = x 
    ... 
    def get_context_data(self, **kwargs): 
    ... 
    context['context_var1'] = self.context_var1 
    ... 
    return context 

ऊपर दिखाए गए के रूप में, मैं form_valid और में संदर्भ चर का एक समूह को अपडेट: यहाँ मेरी समस्या समझाने के लिए एक कोड का टुकड़ा है context शब्दकोश। इस कोड के साथ समस्या यह है कि context_var1 में परिवर्तन नहीं देखा गया है - हो सकता है क्योंकि get_context_data form_valid विधि से पहले कहा जाता है। क्या के लिए कोई कामकाज है?

उत्तर

25

मैं इसे form_invalid के साथ करता हूं। यहां बताया गया है कि मैं इसे कैसे करता हूं:

from django.views.generic import FormView 

class ContextFormView(FormView): 
    def get(self, request, *args, **kwargs): 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     context = self.get_context_data(**kwargs) 
     context['form'] = form 
     return self.render_to_response(context) 

    def post(self, request, *args, **kwargs): 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     if form.is_valid(): 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form, **kwargs) 

    def form_invalid(self, form, **kwargs): 
     context = self.get_context_data(**kwargs) 
     context['form'] = form 
     return self.render_to_response(context) 

आप ऐसा ही कर सकते हैं लेकिन form_valid के लिए। आम तौर पर form_valid के शरीर इस तरह दिखता है:

def form_valid(self, form): 
    return HttpResponseRedirect(self.get_success_url()) 

आप post और form_valid, क्योंकि दोनों post कॉल form_valid ओवरराइड करने के लिए होगा।

def post(self, request, *args, **kwargs): 
    form_class = self.get_form_class() 
    form = self.get_form(form_class) 
    if form.is_valid(): 
     return self.form_valid(form, **kwargs) 
    else: 
     return self.form_invalid(form, **kwargs) 

def form_valid(self, form, **kwargs): 
    # take some other action here 
    return HttpResponseRedirect(self.get_success_url()) 

ओह और बस स्पष्ट करने के लिए, कारण इस समस्या मौजूद है ProcessFormView वर्ग के get विधि टूट गया है है। यह सामान्य रूप से इस तरह दिखता है:

def get(self, request, *args, **kwargs): 
    form_class = self.get_form_class() 
    form = self.get_form(form_class) 
    return self.render_to_response(self.get_context_data(form=form)) 

यह सिर्फ kwargs दूर (._.)

+2

समाधान के लिए धन्यवाद। दो साल बाद और Django अभी भी form_valid या form_invalid में संदर्भ अद्यतन करने का कोई तरीका प्रदान नहीं करता है। – pymarco

+0

और न Django में 1.7 :( – vinyll

+1

Do Django 1.8 form_valid में संदर्भ अद्यतन करने के लिए एक तरीका प्रदान करते? –

0

फेंकता शायद तुम इस दृष्टिकोण का उपयोग कर सकते हैं:

class SomeView(View): 

    def post(self, request): 
     my_form = MyForm(request.POST) 
     if my_form.is_valid(): 
      context['foo'] = 'bar' 

     return render(request, 'valid/path.html', context) 
1

में views.py

class UploadTest(FormView): 
    template_name = 'test.html' 
    .... 
    plus_context = dict() 

    def form_valid(self, form): 
     ... 
     self.plus_context['you_want_context'] = value 
     ... 
     return super(UploadTest, self).form_valid(form) 

    def get_context_data(self, **kwargs): 
     context = super(UploadTest, self).get_context_data(**kwargs) 
     context['plus_context_key'] = self.plus_context 
     return context 

में test.html

<html> 
    .... 
    <body> 
    .... 
    // first post can not get plus_context_key 
    {% if plus_context_key %} 
     {{ plus_context_key.you_want_context }} 
    {% endif %}  
    </body> 
</html> 

मैं सिर्फ Django 1.10.3 में इस तरह से पता लगाता हूं। आशा आपकी मदद कर सकती है

+0

यदि फॉर्म स्वयं को रीडायरेक्ट करता है, तो यह फ़ॉर्म व्यू पर 'GET' के साथ भी' plus_context_key' सामग्री प्रदर्शित करेगा। इसके आस-पास पहुंचने के लिए, किसी भी बाद के 'GET' के परिणाम को रीसेट करने के लिए 'context.plus_context = dict()' संदर्भ [' plus_context_key '] = self.plus_context' का उपयोग करें – shadi

0

Django 2.0.1 में आप get_context_data या form_invalid को ओवरराइड करके संदर्भ डेटा डाल सकते हैं।

आपके मामले में आप निम्नलिखित ओवरराइड में से एक कर सकता है:

class QuestionView(FormView): 
    ... 

    def form_invalid(self, form): 
     """If the form is invalid, render the invalid form.""" 
     return self.render_to_response(
      self.get_context_data(
       form=form, 
       context_key=some_value 
      ) 
     ) 

या:

class QuestionView(FormView): 
    ... 

    def get_context_data(self, **kwargs): 
     if 'context_key' not in kwargs: # set value if not present 
      kwargs['context_key'] = some_value 
     return super().get_context_data(**kwargs) 

Django हुड के नीचे आवेषण 2.0.1 get_context_data की kwargs में प्रपत्र।

# File: django.views.generic.edit 

class FormMixin(ContextMixin): 
    ... 

    def form_valid(self, form): 
     """If the form is valid, redirect to the supplied URL.""" 
     return HttpResponseRedirect(self.get_success_url()) 

    def form_invalid(self, form): 
     """If the form is invalid, render the invalid form.""" 
     return self.render_to_response(self.get_context_data(form=form)) 

    def get_context_data(self, **kwargs): 
     """Insert the form into the context dict.""" 
     if 'form' not in kwargs: 
      kwargs['form'] = self.get_form() 
     return super().get_context_data(**kwargs) 
संबंधित मुद्दे