我有一个标准的多对一关系设置.有很多字段,但就我们的目的而言,相关模型是:
class Class(models.Model):
name = models.CharField(max_length=128)
class Student(models.Model):
class = models.ForeignKey(Class)
name = models.CharField(max_length=128)
address = models.CharField(max_length=128)
# ...etc
Run Code Online (Sandbox Code Playgroud)
我创建了一个管理员,它运行得很好.在我编辑学生时,它甚至可以自动设置班级.但是,当我去创建/编辑一个类时,我得到的只是名称的输入框.
有没有办法添加一个框/字段,可以从Class管理页面添加学生作为Class的成员?我可以在线创建一个表单,但那就是创建新的学生.我已经创建了所有学生,我只是在寻找一种快速方法,将多个现有学生添加到不同的班级.
有没有机会在django admin中添加链接到'raw_id_fields'旁边的外键对象的页面?我使用raw_id_fields来减少对mysql的查询次数.当我不使用raw_id_fields时,我可以编辑或添加外键对象.
如何用raw_id_fields做到这一点?
@AntoinePinsard,我尝试了第二种解决方案."Edit My FK"字段已创建,但除了连字符外什么也没有.
那是我的模式.
class FlatAdmin(admin.ModelAdmin):
inlines = [NeedInline]
readonly_fields = ('flat_house_edit_link',)
raw_id_fields = ('flat_house',)
list_display = ('show_date','show_block','show_house','show_rooms','show_price','show_stage')
list_filter = ('flat_house__house_block','flat_rooms')
search_fields = ('flat_house__id',)
field = ['flat_house','flat_house_edit_link','flat_owner','flat_price','flat_rooms','flat_total_sq','flat_life_sq','flat_kitchen_sq','flat_floors']
def flat_house_edit_link(self, instance):
if instance:
fk_id = instance.user_id
else:
fk_id = None
if fk_id:
opts = instance._meta.get_field('flat_house').rel.model._meta
related_url = reverse(
'admin:{}_{}_change/?_to_field=id&_popup=1'.format(
opts.ha,
opts.house,
),
args=[fk_id],
)
return format_html(
'<a target=_blank href="{}">Go!</a>', related_url)
else:
return "No related object"
flat_house_edit_link.short_description = "Change house"
admin.site.register(Flat,FlatAdmin)
Run Code Online (Sandbox Code Playgroud) 简而言之:我有 2 个模型:Book和Shelf. 在管理表单(“添加书架”)中,我想从图书馆中已有的书籍中进行选择。默认情况下这是不可用的。
我使用了解决方案(来自上面的链接)并且一切正常,直到我尝试“保存”新对象。
错误:
未保存的模型实例 (Shelf: ShelfAlpha) 不能用于 ORM 查询。
#models.py
class Book(models.Model):
shelf = models.ForeignKey(Shelf, blank=True, null=True,
related_name="in_shelf")
#admin.py
class ShelfForm(forms.ModelForm):
class Meta:
model = Shelf
books = forms.ModelMultipleChoiceField(queryset=Book.objects.all())
def __init__(self, *args, **kwargs):
super(ShelfForm, self).__init__(*args, **kwargs)
if self.instance:
if self.instance.in_shelf:
self.fields['books'].initial = self.instance.in_shelf.all()
else:
self.fields['books'].initial = []
def save(self, *args, **kwargs):
instance = super(ShelfForm, self).save(commit=False)
self.fields['books'].initial.update(shelf=None)
self.cleaned_data['books'].update(shelf=instance)
return instance
Run Code Online (Sandbox Code Playgroud)
似乎在 2014 年工作,但现在不是。
我将不胜感激!