django admin - 选择反向外键关系(不创建,我想添加可用) [英] django admin - select reverse foreign key relationships (not create, I want to add available)

查看:1443
本文介绍了django admin - 选择反向外键关系(不创建,我想添加可用)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

让我们说我有一个模型学校和另一个模型学生

  class Student(models.Model):
school = models.ForeignKey(School)
name = models.CharField(max_length = 100)

当管理员点击学校后,会出现一个新页面,显示学校模型字段和值。 p>

我也想在该页面中选择已经可用的学生列表。



内联是不同的,他们将允许创建和编辑属于该学校的新记录(学生)的能力。但我不想要,假设已经有很多学生记录可用。我应该能够从该学校模型页面的管理员中选择它们。

解决方案

  class SchoolAdminForm(forms.ModelForm):
students = forms.ModelMultipleChoiceField(
queryset = Student.objects.all(),
widget = FilteredSelectMultiple(verbose_name ='students',is_stacked = False))

class Meta:
model = School
fields = ['your_school_fields_go_here']

def __init __(self,* args,** kwargs):
super(SchoolAdminForm,self).__ init __(* args,** kwargs)
如果self.instance:
#填充初始相关值
self.fields ['students'] .initial = self.instance.student_set.all()

class SchoolAdmin(admin.ModelAdmin):
form = SchoolAdminForm

def save_model(self,request, obj,form,change):
original_students = obj.student_set.all()
new_students = form.cleaned_data [ student']
remove_qs = original_students.exclude(id__in = new_students.values('id'))
add_qs = new_students.exclude(id__in = original_students.values('id'))
remove_qs中的项目:
obj.student_set.remove(item)
添加add_qs:
obj.student_set.add(item)
obj.save()


Lets say I have a model School and another model Student.

class Student(models.Model):
   school = models.ForeignKey(School)
   name = models.CharField(max_length=100)

When a school is clicked in admin, then a new page appears showing school model fields and values.

I also want to select the already available list of students in that page itself.

Inlines is different, they will allow the ability to create and edit new records(student) belonging to that school. But I don't want that, lets assume there are already many student records available. I should be able to select them in admin from that school model page.

解决方案

class SchoolAdminForm(forms.ModelForm):
    students = forms.ModelMultipleChoiceField(
        queryset=Student.objects.all(),
        widget=FilteredSelectMultiple(verbose_name='students', is_stacked=False))

    class Meta:
        model = School
        fields = ['your_school_fields_go_here']

    def __init__(self, *args, **kwargs):
        super(SchoolAdminForm, self).__init__(*args, **kwargs)
        if self.instance:
            # fill initial related values
            self.fields['students'].initial = self.instance.student_set.all()

class SchoolAdmin(admin.ModelAdmin):
   form = SchoolAdminForm

   def save_model(self, request, obj, form, change):
       original_students = obj.student_set.all()
       new_students = form.cleaned_data['students']
       remove_qs = original_students.exclude(id__in=new_students.values('id'))
       add_qs = new_students.exclude(id__in=original_students.values('id'))
       for item in remove_qs:
           obj.student_set.remove(item)
       for add in add_qs:
           obj.student_set.add(item)
       obj.save()

这篇关于django admin - 选择反向外键关系(不创建,我想添加可用)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆