سؤال

أولا، سأضع ما أحاول تحقيقه في حالة وجود طريقة مختلفة للذهاب حولها!

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

من الواضح أن المشكلة تأتي مع الجانب الخلفي، حيث يعمل الجانب الرئيسي (حيث يتم تعريف العلاقة) على ما يرام تلقائيا.

لقد جربت بعض النصائح هنا للحصول على مضمنة لتظهر وتؤدي ذلك ولكنها ليست واجهة لطيفة للغاية.

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

إليك المقتطف المناسب من التعليمات البرمجية:

#models.py
class Tag(models.Model):
    name = models.CharField(max_length=200)

class Project(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField()
    tags = models.ManyToManyField(Tag, related_name='projects')

#admin.py
class TagForm(ModelForm):
    fields = ('name', 'projects')
    projects = ModelMultipleChoiceField(Project.objects.all(), widget=SelectMultiple())
    class Meta:
        model = Tag

class TagAdmin(admin.ModelAdmin):
    fields = ('name', 'projects')
    form = TagForm

سيكون موضع تقدير كبير أي مساعدة، إما في الحصول على الكود أعلاه للعمل أو من خلال توفير طريقة أفضل للقيام بذلك!

ديفيدم

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

المحلول

السبب في عدم وجود شيء يحدث تلقائيا هو أن حقل "المشاريع" ليس جزءا من نموذج العلامة. مما يعني أن عليك أن تفعل كل العمل بنفسك. شيء مثل (في Tagform):

def __init__(self, *args, **kwargs):
    super(TagForm, self).__init__(*args, **kwargs)
    if 'instance' in kwargs:
        self.fields['projects'].initial = self.instance.project_set.all()

def save(self, *args, **kwargs):
    super(TagForm, self).save(*args, **kwargs)
    self.instance.project_set.clear()
    for project in self.cleaned_data['projects']:
        self.instance.project_set.add(project)

لاحظ أن الكود غير مهتم بحيث تحتاج إلى Tweek Tweek Fact للحصول عليه للعمل.

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