2012-03-02 11 views
7

Django में क्लास-बेस अपडेटव्यू में, मैं उपयोगकर्ता फ़ील्ड को बाहर कर देता हूं क्योंकि यह सिस्टम के लिए आंतरिक है और मैं इसके लिए नहीं पूछूंगा। अब उपयोगकर्ता को फ़ॉर्म में पास करने का उचित Django तरीका क्या है। (अब मैं इसे कैसे करता हूं, क्या मैं उपयोगकर्ता को फॉर्म में में पास करता हूं और फिर फॉर्म की सेव() विधि को ओवरराइड करता हूं। लेकिन मुझे लगता है कि ऐसा करने का एक उचित तरीका है। कुछ छुपा हुआ फ़ील्ड या । है कि प्रकृति की बातोंdjango क्लास-आधारित दृश्य - UpdateView - फ़ॉर्म प्रसंस्करण करते समय अनुरोध उपयोगकर्ता तक कैसे पहुंचे?

# models.py 
class Entry(models.Model): 
    user = models.ForeignKey(
       User, 
       related_name="%(class)s", 
       null=False 
    ) 

    name = models.CharField(
       blank=False, 
       max_length=58, 
    ) 

    is_active = models.BooleanField(default=False) 

    class Meta: 
     ordering = ['name',] 

    def __unicode__(self): 
     return u'%s' % self.name 

# forms.py 
class EntryForm(forms.ModelForm): 
    class Meta: 
     model = Entry 
     exclude = ('user',) 

# views.py 
class UpdateEntry(UpdateView): 
    model = Entry 
    form_class = EntryForm 
    template_name = "entry/entry_update.html" 
    success_url = reverse_lazy('entry_update') 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(UpdateEntry, self).dispatch(*args, **kwargs) 

# urls.py 
url(r'^entry/edit/(?P<pk>\d+)/$', 
    UpdateEntry.as_view(), 
    name='entry_update' 
), 

उत्तर

7

एक छिपी हुई फ़ील्ड गुजर की तरह चारों ओर हैकिंग मतलब नहीं है के रूप में इस सही मायने में ग्राहक के साथ कोई संबंध नहीं है - इस क्लासिक "उपयोगकर्ता के प्रवेश के साथ संबद्ध" समस्या निश्चित रूप से पर संभाला जाना चाहिए सर्वर पक्ष

मैं इस व्यवहार को form_valid विधि में डाल दूंगा।

class MyUpdateView(UpdateView): 
    def form_valid(self, form): 
     instance = form.save(commit=False) 
     instance.user = self.request.user 
     super(MyUpdateView, self).save(form) 

    # the default implementation of form_valid is... 
    # def form_valid(self, form): 
    #  self.object = form.save() 
    #  return HttpResponseRedirect(self.get_success_url()) 
+3

मैं अंतिम दो पंक्तियों को हटाने ('.save()' और 'return') और उन्हें' सुपर (MyUpdateView, आत्म) के साथ की जगह की सिफारिश .form_valid (फार्म) '। यह आपके संशोधित फॉर्म इंस्टेंस पर डिफ़ॉल्ट फॉर्म_वालिड() (आपकी पिछली दो पंक्तियों के समान) निष्पादित करेगा, जो आपके कोड को किसी भी भावी बदलाव के साथ सिंक में रखेगा जो Django प्रोजेक्ट इस विधि को बनाता है। – Bryson

+0

@ ब्रिसन, अच्छा! मैंने वास्तव में पहले कभी नहीं किया है। मुझे लगता है कि यह तुरंत सहज नहीं है कि उदाहरण form.instance पर संदर्भित है और इस प्रकार संशोधित भविष्य को बचाने() कॉल को फिर से प्रभावित करता है। –

+0

कुछ जो मुझे याद आया: केवल 'instance =' का उपयोग करने के बजाय मुझे विश्वास है कि आपको 'form.instance =' का उपयोग करना चाहिए। यह उपयोगकर्ता को ऑब्जेक्ट ऑब्जेक्ट से जोड़ देगा (मान लें कि आपका फॉर्म इस फ़ील्ड के साथ बनाया गया था, अन्यथा यह फॉर्म उदाहरण के लिए "फॉर्म में कोई विशेषता नहीं है 'उपयोगकर्ता') जैसे कुछ त्रुटि होगी, जिसे फिर' सुपर() '। जैसा कि लिखा गया है, अब उपयोगकर्ता डेटा के साथ संशोधित रूप को 'आवृत्ति' नामक चर में सहेजा गया है जो कभी भी 'form_valid' के आपके संस्करण को नहीं छोड़ता है, इसलिए क्योंकि आपने' सुपर() 'पर स्विच किया है, यह कभी भी सहेजा नहीं जाता है। क्षमा करें यह जटिल हो गया। हाहा – Bryson

2

एक HttpResponse ऑब्जेक्ट वापस करना होगा। नीचे दिए गए कोड काम करता है:

class MyUpdateView(UpdateView): 
    def form_valid(self, form): 
     instance = form.save(commit=False) 
     instance.user = self.request.user 
     return super(MyUpdateView, self).form_valid(form) 
संबंधित मुद्दे