2011-04-26 10 views
22

तो मैं एक मॉडल भी शामिल है कि:कक्षा में request.user एक्सेस करना Django में FK क्षेत्र सेट करने के लिए आधारित सामान्य दृश्य CreateView

class Place(models.Model): 
    .... 
    created_by = models.ForeignKey(User) 

मेरा विचार तो की तरह है:

class PlaceFormView(CreateView): 
    form_class = PlaceForm 

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

है request.user तक पहुंचने और उस उपयोगकर्ता को create_by सेट करने का कोई तरीका है? मैंने दस्तावेज़ों को देखा है, लेकिन इस ओर कोई संकेत नहीं दिख रहा है।

`

उत्तर

22

कैसे form_valid जो फार्म की बचत करता है अधिभावी के बारे में? इसे स्वयं सहेजें, जो भी आप चाहते हैं, फिर रीडायरेक्ट करें।

class PlaceForm(forms.ModelForm): 
    ... 
    ... 
    ... 

    def __init__(self, *args, **kwargs): 
     self.created_by = kwargs['initial']['created_by'] 
     super(PlaceForm, self).__init__(*args, **kwargs) 

    def save(self, commit=True): 
     obj = super(PlaceForm, self).save(False) 
     obj.created_by = self.created_by 
     commit and obj.save() 
     return obj 

class PlaceFormView(CreateView): 
    ... 
    ... 
    form_class = PlaceForm 

    def get_initial(self): 
     self.initial.update({ 'created_by': self.request.user }) 
     return self.initial 

यह:

class PlaceFormView(CreateView): 
    form_class = PlaceForm 

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

    def form_valid(self, form): 
     obj = form.save(commit=False) 
     obj.created_by = self.request.user 
     obj.save()   
     return http.HttpResponseRedirect(self.get_success_url()) 
+0

धन्यवाद! यह रीडायरेक्ट को छोड़कर, काम करता है। मुझे त्रुटि मिलती है: "कोई यूआरएल रीडायरेक्ट करने के लिए नहीं। या तो एक यूआरएल प्रदान करें या मॉडल पर get_absolute_url विधि को परिभाषित करें।" हालांकि, मेरे पास मॉडल पर get_absolute_url() सेट है, और जब मुझे पहली बार यह दृश्य मिल रहा था (form_by के साथ एक चुनिंदा बॉक्स के साथ) यह ठीक से रीडायरेक्ट किया गया। इसे अभी समझने की कोशिश कर रहा है। कोई विचार? – Brian

+1

हां, ऐसा प्रतीत होता है get_absolute_url self.object से खींचा जाता है - इसलिए अपने कोड में, 'form_valid' –

+0

में 'self.object = obj' सेट करें। यह काम कर रहा है। – Brian

2

यह करने के लिए एक वैकल्पिक तरीका CreateView में get_initial() विधि को अधिलेखित करने के माध्यम से उपयोगकर्ता गुजरती हैं, और PlaceForm कक्षा में विधि बचाने संशोधित करने के लिए उपयोगकर्ता को बचाने के लिए है जिस तरह से बचत तर्क अभी भी फॉर्म वर्ग के भीतर encapsulated है।

+0

यदि उपयोगकर्ता डेटाबेस में फ़ील्ड आवश्यक है तो काम नहीं कर रहा है – AmiNadimi

8

मुझे पता है कि यह पुराना है, लेकिन इस समस्या के साथ अन्य लोगों के लिए:

एक भी सरल तरीका है - एक रूप को कई बार हमेशा एक ही मॉडल उदाहरण का उपयोग करेगा बचत के बाद से, आप भी कर सकते हैं:

def form_valid(self, form): 
    obj = form.save(commit=False) 
    obj.created_by = self.request.user 
    return super(PlaceFormView, self).form_valid(form) 

इस तरह, आप सुपर कॉल के सभी लाभ प्राप्त - यह देखने के लिए कि तुम सच में ही कोड के उन दो पंक्तियों को जोड़ रहे हैं तुच्छ है, और आप रीडायरेक्ट लॉजिक नकल से अपने आप को दोहराने की जरूरत नहीं है ।

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