2011-04-29 16 views
11

में बहिष्कृत गुण जोड़ना मेरे पास एक मॉडलफॉर्म है और मैंने दो फ़ील्ड, create_date और created_by फ़ील्ड को बाहर रखा है। save() विधि का उपयोग करते समय अब ​​मुझे "नहीं शून्य" त्रुटि मिलती है क्योंकि created_by खाली है।Django, प्रस्तुत मॉडलफॉर्म

मैंने save() विधि से पहले इस फ़ॉर्म को उपयोगकर्ता आईडी जोड़ने की कोशिश की है: form.cleaned_data['created_by'] = 1 और form.cleaned_data['created_by_id'] = 1। लेकिन इनमें से कोई भी काम नहीं करता है।

क्या कोई मुझे बता सकता है कि मैं सबमिट किए गए मॉडलफॉर्म में अतिरिक्त सामग्री कैसे जोड़ सकता हूं ताकि वह बचा सके?

class Location(models.Model): 
    name = models.CharField(max_length = 100) 
    created_by = models.ForeignKey(User) 
    create_date = models.DateTimeField(auto_now=True) 

class LocationForm(forms.ModelForm): 
    class Meta: 
     model = Location 
     exclude = ('created_by', 'create_date',) 

उत्तर

17

जब से तुम क्षेत्रों created_by और अपने रूप में create_date बाहर रखा गया है, form.cleaned_data के माध्यम से उन्हें आवंटित करने के लिए किसी भी मतलब नहीं है की कोशिश कर रहा।

आप दृश्य दिखाई देते हैं, तो आप बस form.save(commit=False) उपयोग करना और फिर सेट कर सकते हैं created_by

def my_view(request): 
    if request.method == "POST": 
     form = LocationForm(request.POST) 
     if form.is_valid(): 
      obj = form.save(commit=False) 
      obj.created_by = request.user 
      obj.save() 
     ... 
     ... 

`

का मूल्य आप उपयोग कर रहे हैं:

यहाँ आप क्या कर सकते हैं है व्यवस्थापक, वांछित परिणाम प्राप्त करने के लिए आप save_model() विधि को ओवरराइड कर सकते हैं।

class LocationAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     obj.created_by = request.user 
     obj.save() 
+1

धन्यवाद आदमी! इतना आसान .. –

+1

गंभीरता से, टट्टू पर गर्व होगा। – Civilian

+0

उपर्युक्त मेरे लिए काम नहीं कर रहा था। मेरे मॉडलफॉर्म मेटा में, मैं बहिष्कृत करने के बजाय, फ़ील्ड को शामिल करने के लिए निर्दिष्ट कर रहा था। समस्या को हल कर दिया गया था, जब मैं "फ़ील्ड" का उपयोग कर रहा था, तो मैं क्लास वेरिएबल "शामिल" का उपयोग कर रहा था। इस प्रकार जिन क्षेत्रों को मैं बाहर करना चाहता था उन्हें शामिल किया गया था और फॉर्म मान्य नहीं होगा। – Chuck

4

, एक पैरामीटर निर्माता के रूप में के रूप में एक उपयोगकर्ता दर्रा तो इसका इस्तेमाल एक मॉडल उदाहरण के created_by क्षेत्र स्थापित करने के लिए: form.save का उपयोग कर (प्रतिबद्ध द्वारा

def add_location(request): 
    ... 
    form = LocationForm(user=request.user) 
    ... 

class LocationForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user') 
     super(forms.ModelForm, self).__init__(*args, **kwargs) 
     self.instance.created_by = user 
0

एक तरह से यह करने के लिए किया जाता है = झूठा) (doc)

वह डेटाबेस क्लास के बिना मॉडल क्लास के ऑब्जेक्ट इंस्टेंस को वापस कर देगा।

तो, अपने प्रसंस्करण कुछ इस तरह दिख सकता है:

form = some_form(request.POST) 
location = form.save(commit=False) 
user = User(pk=1) 
location.created_by = user 
location.create_date = datetime.now() 
location.save() 
+0

ध्यान दें कि आपको फ़ॉर्म की save_m2m() विधि –

+0

पर कॉल करना होगा, यदि मॉडल से जुड़े कई से अधिक संबंध हैं। – Brant

1

सही समाधान मॉडल के निर्माता के लिए प्री-भरे फ़ील्ड के साथ ऑब्जेक्ट का एक उदाहरण पास करना है। इस तरह फ़ील्ड सत्यापन समय पर आबादी होगी। form.save() के बाद मूल्यों को असाइन करने के परिणामस्वरूप फ़ील्ड की आवश्यकता होने पर सत्यापन त्रुटियां हो सकती हैं।

LocationForm(request.POST or None, instance=Location(
    created_by=request.user, 
    create_date=datetime.now(), 
)) 

ध्यान दें कि उदाहरण एक सहेजे गए ऑब्जेक्ट है, इसलिए आईडी को तब तक असाइन नहीं किया जाएगा जब तक फॉर्म इसे सहेजता नहीं है।

+0

मुझे व्यक्तिगत रूप से लगता है कि यह एक बेहतर दृष्टिकोण है –

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