use*_*745 8 python django django-admin
让我们说我有一个模型School
和另一个模型Student
.
class Student(models.Model):
school = models.ForeignKey(School)
name = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
在管理员中单击学校时,将显示一个显示学校模型字段和值的新页面.
我还想在该页面中选择已有的学生列表.
内联是不同的,它们将允许创建和编辑属于该学校的新记录(学生).但我不希望这样,我们假设已经有很多学生记录可用.我应该可以从该学校模型页面的管理员中选择它们.
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 item in add_qs:
obj.student_set.add(item)
obj.save()
Run Code Online (Sandbox Code Playgroud)
Pet*_*ler -1
您的意思是,对于给定的School
实例,您希望能够获得与该学校相关的所有学生的列表?
在这种情况下,您可以使用related_name
指定的ForeignKey 关系的属性。您还没有定义related_name
您要做的事情:
school = models.ForeignKey(School)
Run Code Online (Sandbox Code Playgroud)
没关系,它只是使用默认的相关名称,即子类(学生)的名称,后跟 _set
所以对于你的学校来说:
school = School.objects.get(pk=1)
students = school.student_set.all() # or .filter() or .exclude() etc
Run Code Online (Sandbox Code Playgroud)
然后您可以将该学生查询集传递到您的模板中。
归档时间: |
|
查看次数: |
1300 次 |
最近记录: |