2010-03-01 2 views
8

मैं django के इनलाइन फॉर्मेट फैक्ट्री का उपयोग कर रहा हूं। दस्तावेज़ों में उदाहरण का उपयोग करने के लिए,डीजेंगो इनलाइनफॉर्मसेट_फैक्टरी को केवल नई ऑब्जेक्ट्स बनाने के लिए सीमित करें

author = Author.objects.get(pk=1) 
BookFormSet = inlineformset_factory(Author, Book) 
formset = BookFormSet(request.POST, instance=author) 

किसी विशेष लेखक द्वारा पुस्तकों को संपादित करने के लिए एक इनलाइन फॉर्मेट तैयार करेगा।

मैं एक फॉर्मेट बनाना चाहता हूं जो उपयोगकर्ताओं को उस लेखक द्वारा नई पुस्तकें जोड़ने, मौजूदा पुस्तकों को संपादित नहीं करने की अनुमति देता है। ऐसा करने के लिए इनलाइनफॉर्मसेट_फैक्टरी का उपयोग करने का कोई आसान तरीका है?

उत्तर

6

inlineformset_factory एक फॉर्मेट kwarg लेता है, जो बेसइनलाइनफॉर्मसेट पर डिफ़ॉल्ट है। BaseInlineFormSet Subclasses BaseModelFormSet, जो get_queryset विधि को परिभाषित करता है। यदि आप BaseInlineFormSet सबक्लास बनाते हैं और EmptyQuerySet() को वापस करने के लिए get_queryset को ओवरराइड करते हैं, तो आपको वह प्राप्त करना चाहिए जो आप बाद में कर रहे हैं। ऊपर के उदाहरण तो में, यह इस तरह दिखेगा:

from django.db.models.query import EmptyQuerySet 
from django.forms.models import BaseInlineFormSet 

class BaseInlineAddOnlyFormSet(BaseInlineFormSet): 
    def get_queryset(self): 
     return EmptyQuerySet() 

author = Author.objects.get(pk=1) 
BookFormSet = inlineformset_factory(Author, Book, formset=BaseInlineAddOnlyFormSet) 
formset = BookFormSet(request.POST, instance=author) 
+1

[डॉक्स] (https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#changing-the- क्वेरीसेट) कहता है कि सुपरसेट पर कॉल करने के बाद क्वेरीसेट सेट करने का पसंदीदा तरीका ओवरराइड '__init__' है। लेकिन वह मेरे लिए काम नहीं कर रहा है। आपकी विधि सुपर की '__init__' पर कॉल करने से पहले kwarg' queryset' को सेट करने के रूप में करती है। धन्यवाद। –

0

वास्तव में इस सवाल का जवाब documentation में दी गई है। फॉर्मसेट पर बस कोई उदाहरण न दें।

>>> from django.forms.models import inlineformset_factory 
>>> BookFormSet = inlineformset_factory(Author, Book) 
>>> author = Author.objects.get(name=u'Mike Royko') 
>>> formset = BookFormSet() # This will create an empty form with your model fields 

फिर आप दृश्य बना सकते हैं इस प्रकार है::

if request.method == "POST": 
    formset = BookFormSet(request.POST, request.FILES) 
    if formset.is_valid(): 
     formset.save() 
else: 
    formset = BookFormSet() 
return render_to_response("add_book.html", { 
    "formset": formset, 

आशा है कि यह मदद करता है डॉक से।

+0

यह मेरे लिए काम नहीं करता है; यह अभी भी सभी 'बुक' के साथ फॉर्मेट को पॉप्युलेट करता है। django 1.4। –

1

जेरेमी लुईस के आधार पर और यदि आप बेसइनलाइनफॉर्मसेट को उपclass नहीं करना चाहते हैं, तो आप बस अपने BookFormSet पर एक खाली क्वेरीसेट पैरामीटर दे सकते हैं।

देखें छद्म (untested) Django 1.6 कोड नमूना:

BookFormSet = inlineformset_factory(parent=Author, model=Book) 
if request.method == "POST": 
    formset = BookFormSet(request.POST, request.FILES, instance=author) 
    if formset.is_valid(): 
     formset.save() 
else: 
    queryset = Book.objects.none() # does not allow to edit books 
    formset = BookFormSet(instance=project, initial=initial, queryset=queryset) 
return render(request, "add_book.html", { "formset": formset, }) 
+0

inlineformset_factory अब स्पष्ट रूप से निर्दिष्ट 'फ़ील्ड' परम की आवश्यकता है। बस एक अद्यतन। – Rexford

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