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'
),
मैं अंतिम दो पंक्तियों को हटाने ('.save()' और 'return') और उन्हें' सुपर (MyUpdateView, आत्म) के साथ की जगह की सिफारिश .form_valid (फार्म) '। यह आपके संशोधित फॉर्म इंस्टेंस पर डिफ़ॉल्ट फॉर्म_वालिड() (आपकी पिछली दो पंक्तियों के समान) निष्पादित करेगा, जो आपके कोड को किसी भी भावी बदलाव के साथ सिंक में रखेगा जो Django प्रोजेक्ट इस विधि को बनाता है। – Bryson
@ ब्रिसन, अच्छा! मैंने वास्तव में पहले कभी नहीं किया है। मुझे लगता है कि यह तुरंत सहज नहीं है कि उदाहरण form.instance पर संदर्भित है और इस प्रकार संशोधित भविष्य को बचाने() कॉल को फिर से प्रभावित करता है। –
कुछ जो मुझे याद आया: केवल 'instance =' का उपयोग करने के बजाय मुझे विश्वास है कि आपको 'form.instance =' का उपयोग करना चाहिए। यह उपयोगकर्ता को ऑब्जेक्ट ऑब्जेक्ट से जोड़ देगा (मान लें कि आपका फॉर्म इस फ़ील्ड के साथ बनाया गया था, अन्यथा यह फॉर्म उदाहरण के लिए "फॉर्म में कोई विशेषता नहीं है 'उपयोगकर्ता') जैसे कुछ त्रुटि होगी, जिसे फिर' सुपर() '। जैसा कि लिखा गया है, अब उपयोगकर्ता डेटा के साथ संशोधित रूप को 'आवृत्ति' नामक चर में सहेजा गया है जो कभी भी 'form_valid' के आपके संस्करण को नहीं छोड़ता है, इसलिए क्योंकि आपने' सुपर() 'पर स्विच किया है, यह कभी भी सहेजा नहीं जाता है। क्षमा करें यह जटिल हो गया। हाहा – Bryson