كيفية استخدام نموذج القيم من غير منضم شكل

StackOverflow https://stackoverflow.com/questions/75621

  •  09-06-2019
  •  | 
  •  

سؤال

لدي ويب التقرير أن يستخدم جانغو شكل (أشكال جديدة) الحقول التي تتحكم الاستعلام المستخدمة لإنشاء التقرير (تاريخ البدء أو تاريخ الانتهاء ...).مسألة أواجه هو أن الصفحة يجب أن تعمل باستخدام النموذج الأولي القيم (غير منضم) ، ولكن لا أستطيع الوصول إلى cleaned_data مجال إلا إذا كنت الاتصال is_valid().ولكن is_valid() دائما يفشل في غير منضم الأشكال.

يبدو جانغو أشكال تم تصميمها مع حالة الاستخدام لتحرير البيانات هذه غير منضم شكل ليس من المفيد حقا عن أي شيء آخر سوى عرض HTML.

على سبيل المثال, إذا كنت قد:

if request.method == 'GET':
    form = MyForm()
else:
    form = MyForm(request.method.POST)

if form.is_valid():
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])

is_valid() ستفشل إذا كان هذا هو الحصول على (لأنه غير منضم) ، إذا كنت تفعل:

if request.method == 'GET':
    form = MyForm()
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
else:
    form = MyForm(request.method.POST)
    if form.is_valid():
       do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])

المكالمة الأولى do_query مشغلات الاستثناءات على شكل.cleaned_data ، وهي ليست صالحة لأن is_valid() لا يسمى.يبدو أن علي أن أفعل شيئا مثل:

if request.method == 'GET':
    form = MyForm()
    do_query(form['start_date'].field.initial, form['end_date'].field.initial)
else:
    form = MyForm(request.method.POST)
    if form.is_valid():
       do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])

هذا هو, ليس هناك واجهة مشتركة لاسترجاع شكل قيم بين شكل محدد و غير منضم واحد.

لا أحد يرى نظافة طريقة للقيام بذلك ؟

هل كانت مفيدة؟

المحلول

إذا قمت بإضافة هذا الأسلوب إلى النموذج الخاص بك الدرجة:

def get_cleaned_or_initial(self, fieldname):
        if hasattr(self, 'cleaned_data'):
            return self.cleaned_data.get(fieldname)
        else:
            return self[fieldname].field.initial

ثم هل يمكن إعادة كتابة التعليمات البرمجية كما يلي:

if request.method == 'GET':
    form = MyForm()
else:
    form = MyForm(request.method.POST)
    form.is_valid()

do_query(form.get_cleaned_or_initial('start_date'), form.get_cleaned_or_initial('end_date'))

نصائح أخرى

غير منضم يعني لا توجد بيانات المرتبطة شكل (سواء الأولية أو قدمت في وقت لاحق) ، لذلك التحقق قد تفشل.كما ورد في إجابات أخرى (و في الختام) ، عليك أن تقدم القيم الأولية والتحقق من الملزمة البيانات والقيم الأولية.

في حالة استخدام النماذج هو نموذج تجهيز و التحقق من صحة ، لذلك يجب أن يكون لديك بعض البيانات للتحقق قبل الوصول إلى cleaned_data.

يمكنك تمرير قاموس القيم الأولية إلى النموذج الخاص بك:

if request.method == "GET":
    # calculate my_start_date and my_end_date here...
    form = MyForm( { 'start_date': my_start_date, 'end_date': my_end_date} )
...

ترى الرسمية أشكال وثائق API, حيث أنها تثبت هذا.

تحرير:استنادا إلى إجابات من المستخدمين الآخرين ، ربما هذا هو أنظف الحل:

if request.method == "GET":
    form = MyForm()
    form['start_date'] = form['start_date'].field.initial
    form['end_date'] = form['end_date'].field.initial
else:
    form = MyForm(request.method.POST)
if form.is_valid():
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])

لم أحاول هذا على الرغم ؛ يمكن لأحد أن يثبت أن يعمل هذا ؟ وأعتقد أن هذا هو أفضل من خلق طريقة جديدة ، لأن هذا النهج لا تتطلب رمز آخر (ربما لم يكتب من قبلك) عن الجديد 'السحر' accessor.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top