मेरे पास एक मॉडल है, Director
दो डेटफिल्ड्स, और दो उप-वर्ग (नीचे कोड) के साथ। मैं प्रत्येक निदेशक के लिए एक व्यवस्थापक पृष्ठ बनाने की कोशिश कर रहा हूं जो संबंधित सबक्लास उदाहरण दिखाता है, न कि Director
उदाहरण; यह हिस्सा अधिकतर आसान है (मैं प्रत्येक उप-वर्ग के लिए एक इनलाइन बना देता हूं, मुख्य मॉडलएडमिन को सभी फ़ील्ड को छोड़कर एक फॉर्म देता हूं, और मुख्य मॉडलएडमिन केवल इनलाइनों से फ़ॉर्मेट्स का अनुरोध करता है जिसमें एक समान उदाहरण होता है - कोड; एक अनसुलझा समस्या है इस दृष्टिकोण के साथ, जो मैं नीचे नोट करता हूं, लेकिन इस प्रश्न का ध्यान नहीं है)।Django व्यवस्थापक: रीडोनली फ़ील्ड को प्रारूपित करने के लिए कैसे?
मेरी समस्या यह है कि मैं उपयोगकर्ता को प्रदर्शित मूल्यों को मालिश करना चाहता हूं, जिनमें से एक एक पाठक क्षेत्र में दिखाया गया है, जिसमें से एक नहीं है। प्रसंस्करण यह है कि मैं एक जादू मान (date(1,1,1)
) स्ट्रिंग "On incorporation"
में बदलना चाहता हूं।
रीडोनली फ़ील्ड में तिथियां पार्सिंग के लिए बहुत अनुकूल प्रारूप में प्रस्तुत नहीं की जाती हैं, और मैं जावास्क्रिप्ट पर अनावश्यक निर्भरता को कम करना चाहता हूं, इसलिए मैं सर्वर-साइड समाधान को बहुत पसंद करूंगा।
नीचे दिया गया कोड फॉर्मों को प्रदर्शित करता है जैसा कि मैं उन्हें चाहता हूं, सिवाय इसके कि तिथि मानों को मालिश नहीं किया जाता है, और सहेजते समय, कोई गड़बड़ है "कृपया नीचे दी गई त्रुटि को सही करें" संदेश, भले ही कोई त्रुटि न हो, और सभी फ़ील्ड सही ढंग से सहेजे गए हैं।
मेरा प्रश्न है: मैं पृष्ठ पर पाठों को, पाठ क्षेत्रों में और रूपों के दोनों क्षेत्रों में कैसे प्रस्तुत किया जा सकता हूं, और उन्हें मेरे चयन की एक स्ट्रिंग प्रदर्शित करने के लिए कैसे बदल सकता हूं?
मॉडल (अब तक सामग्री के रूप में):
class Director(models.Model, Specializable):
date_of_appointment = models.DateField()
date_ceased_to_act = models.DateField(blank=True,null=True)
class DirectorsIndividual(Director):
pass
class DirectorsCorporate(Director):
pass
व्यवस्थापक कोड:
class DirectorAdmin(EnhancedAdmin):
fields =()
## def formfield_for_dbfield(self, db_field, **kwargs):
## return None
def queryset(self, request):
""" Directors for all companies which are incorporated by the current user's organisation """
individual = Individual.for_user(request.user)
return Director.objects.filter(company__incorporation_ticket__ordered_by__in = Organisation.all_organisations_for_which_individual_authorised_to_incorporate(individual))
class form(forms.ModelForm):
# have this return no html - that way only inlines are shown
class Meta:
fields =()
pass
def is_valid(self):
self._errors = {}
return True
class DirectorsIndividualInline(admin.StackedInline):
model = DirectorsIndividual
fk_name = 'director_ptr'
extra = 0
readonly_fields = ('deferred_on','company','date_of_appointment',)
can_delete = False
def get_readonly_fields(self, request, obj=None):
if obj and obj.company and not obj.company.is_submitted(): return self.readonly_fields # allow editing of fields listed in else
else:
return itertools.chain(self.readonly_fields, ('individual', 'is_secretary'))
def has_delete_permission(self, request, obj=None):
return obj and ((obj.company and not obj.company.is_submitted()) or not obj.company)
class form(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(forms.ModelForm, self).__init__(*args, **kwargs)
self.fields['surrogate_for'].required = False
self.fields['representative_for'].required = False
if self.instance:
obj = self.instance
for field in (f for f in type(obj)._meta.fields if type(f) == fields.DateField):
val = field.value_from_object(obj)
assert (type(val) in (datetime.date, type(None),))
# assert field.name != 'date_of_appointment'
if val == inc_consts.EARLIEST_DATE:
self.initial[field.name] = "On incorporation"
def is_valid(self):
self._errors = {}
return True
class DirectorsCorporateInline(admin.StackedInline):
model = DirectorsCorporate
fk_name = 'director_ptr'
extra = 0
can_delete = False
class form(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(forms.ModelForm, self).__init__(*args, **kwargs)
if True:
for k in self.fields:
self.fields[k].required = False
def is_valid(self):
self._errors = {}
return True
inlines = (DirectorsIndividualInline,DirectorsCorporateInline)
def get_inlines(self, request, obj=None):
return (inline for inline in (self.inline_instances)
if inline.model.objects.filter(**{(inline.fk_name or self.model._meta.object_name.lower()) : obj }))
def get_formsets(self, request, obj=None):
""" only return formset for inlines for which there exists an object """
return (inline.get_formset(request, obj) for inline in self.get_inlines(request, obj))
मुझे पता DirectorsCorporateInline
और DirectorsIndividualInline
के बीच एक विषमता है कि वहाँ; ऐसा इसलिए है क्योंकि मैं DirectorsIndividual
उदाहरण के साथ एक उदाहरण पर परीक्षण कर रहा हूं। उपरोक्त कोड मॉडलों में दिखाए गए मॉडल फ़ील्ड को संदर्भित करता है, क्योंकि वे दिनांक समस्या के लिए सामग्री नहीं हैं; उन क्षेत्रों को बदलने के बिना नकली त्रुटि समस्या के लिए उन्हें असंतोष देना संभव होना चाहिए (हालांकि मुझे एहसास है कि इस मुद्दे के लिए यह कम सहायक है, मैं इस प्रश्न को ज्यादातर एक मुद्दे पर केंद्रित रखना चाहता हूं)। EnhancedAdmin
कुछ मामूली बदलावों के साथ ModelAdmin
सबक्लास है जो परिणाम का नहीं होना चाहिए। अतिरिक्त कोड तर्कसंगत अनुरोध पर दिखाया जा सकता है, लेकिन मैं अप्रासंगिक कोड से भ्रमित नहीं होना चाहता हूं।
पूर्णता के लिए: मैं अजगर 2.7.2 पर django 1.3.1 का उपयोग कर रहा हूं।
वे वास्तव में लगातार प्रस्तुत नहीं किए जाते हैं, जो जावास्क्रिप्ट को दर्द का उपयोग करेंगे; मुझे शायद जानकारी के लिए धन्यवाद देना होगा। – Marcin