هل يمكنني استخدام بطة التصنيف مع وجهات النظر القائمة على الفصل

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

  •  29-07-2022
  •  | 
  •  

سؤال

قد أكون خارج الحجز هنا تمامًا. (لا تتردد في إخباري إذا كنت.)

حالة الاستخدام الخاصة بي هي أن لدي قائمة بالمدارس. نموذج المدرسة بسيط للغاية:

class School(models.Model):
    name = models.CharField(max_length=100)
    mascot = models.CharField(max_length=100, null=True, blank=True)

عندما يريد المستخدم تحرير إحدى هذه المدارس ، لا أريدهم تحرير النسخة الرئيسية. بدلاً من ذلك ، أريد أن أعطيهم نسختهم الخاصة التي يمكنهم اللعب بها. عند الانتهاء من تحرير نسختهم ، يمكنهم تقديم تغييرهم ، وسيوافق عليه شخص آخر. لذلك لدي فصل آخر لنسخة المستخدم من المدرسة:

class UserSchool(models.Model):
    name = models.CharField(max_length=100)
    mascot = models.CharField(max_length=100, null=True, blank=True)
    master_school = models.ForeignKey(School)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)

لذلك قمت بإعداد نموذج للتعامل مع تحرير مدرسة المستخدمين:

class UserSchoolForm(forms.ModelForm):
    class Meta:
        model = UserSchool
        fields = ['name','mascot']

والآن لدي نموذج editschool:

class EditSchool(UpdateView):
    model = School
    success_url = reverse_lazy('list_schools')
    form_class = UserSchoolForm

    def get(self, request, *args, **kwargs):
        school = self.get_object()

        # make a copy of the school for this user
        user_school, created = UserSchool.objects.get_or_create(
            master_school=school, user=request.user,
            defaults={'name' : school.name, 'mascot' : school.mascot})

        self.object = user_school
        form = UserSchoolForm()
        context = self.get_context_data(form=form)
        return self.render_to_response(context)

أعلم أن GET () تقوم بإجراء النسخة بشكل صحيح ، ولكن عندما يتم عرض النموذج ، لا توجد قيم مدرجة في الحقول "الاسم" أو "الافتراضية". شكوكي هي أن المشكلة هي حقيقة أن CLS.Model = School ، لكن Self.Object هي مثيل للمستخدمين.

هل أنا قريب ولكن أفتقد شيئًا؟ هل أنا تماما على المسار الخطأ؟ هل هناك نموذج أفضل لهذا (مثل وجود مثيل مدرسي واحد مع مستخدم خاص لـ "Master")؟

(ومضاعفات صغيرة واحدة-بما أنني يد قديمة في Django ، لكن جديدة تعتمد على الفصل ، أحاول استخدام طرق عرض الفانيليا لأنني أجد أنه من الأسهل معرفة ما يجري.)

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

المحلول

فقط لاستبعاد ما هو واضح - أنت لا تمرر أي شيء إلى مُنشئ النماذج. هل جربته مع instance=user_school؟ قد يكون هناك المزيد الذي يحتاج إلى عمل لكنني سأبدأ هناك.

للتوسع في هذا الأمر قليلاً - من وجهة نظرك ، فأنت تتجاوز المدمج بالكامل get طريقة. هذا جيد ، ولكن هذا يعني أنك تتجاوز بعض السلوك الآلي لرؤيتك الفائقة. على وجه التحديد ، و get طريقة ProcessFormView (واحدة من فصول أجدادك) يثبت النموذج باستخدام get_form طريقة فئة العرض. FormMixin, ، جد آخر ، يحدد get_form:

return form_class(**self.get_form_kwargs())

و get_form_kwargs على ModelFormMixin يضيف self.object إلى النموذج kwargs:

kwargs.update({'instance': self.object})

لأن تجاوزك get الطريقة لا تستدعي get_form, ، كما أنها لا تتصل get_form_kwargs وبالتالي لا يمر عبر المسار بأكمله الذي يوفر ملزمة أولية للنموذج.

أنا شخصياً سأحاول التعامل مع هذا عن طريق تعديل get_object طريقة عرضك المخصص وترك الباقي وحده:

class EditSchool(UpdateView):
    model = School
    success_url = reverse_lazy('list_schools')
    form_class = UserSchoolForm

    def get_object(self, queryset=None):
        school = super(EditSchool, self).get_object(queryset=queryset)
        user_school, created = UserSchool.objects.get_or_create(
            master_school=school, user=self.request.user,
            defaults={'name' : school.name, 'mascot' : school.mascot})
        return user_school

قد يكون هناك المزيد من التغييرات اللازمة - لم أختبر هذا - ولكن كلاهما get و set استخدام الطرق get_object, ، وربطه بالنموذج حسب الاقتضاء.

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