您的位置:首页 > 编程语言 > Go语言

设置django的admin中外键的默认值

2018-02-13 15:15 323 查看

需求背景

基于django admin开发给用户使用的界面,用户在add新的时author这一项会是一个下拉框,而我需要的是让他自动设置为当前用户,最好是不可修改和编辑的,不显示也行

所以明确下我的需求就是,让django能够在点击add时自动就设置当前登陆用户为默认作者,而不需要用户选择。

第一次尝试:

通过这篇文章得知,通过给requert里传参可以设置默认值,只不过是可以编辑的。解决方案的参考代码为:

def add_view(self, request, form_url='', extra_context=None):
g = request.GET.copy()
g['owner'] = request.user
request.GET = g
return super(TaskAdmin, self).add_view(request, form_url, extra_context=extra_context)


问题:

如果我不想让用户编辑作者字段,照理说可以通过下面代码进行设置:

def get_readonly_fields(self, request, obj=None):
"""设置只读字段"""
if request.user.is_superuser:
return ['publish']
else:
return ['publish', 'owner']


但经过实验证明,这种方式跟上面的add_view中设置的默认值有冲突,显示的还是None。

第二次尝试:

又参考了这篇,参考代码为:

def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
"""对外键进行设置"""
if db_field.name == 'author':
kwargs['initial'] = request.user.id
return super(TaskAdmin, self).formfield_for_foreignkey(
db_field, request, **kwargs
)


的确可以用,效果跟上一种一样,所以也有同样的问题

最终尝试

最后终于找到了这篇文章,可以解决了。

def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
"""对外键进行设置"""
if db_field.name == 'author':
kwargs['initial'] = request.user.id
kwargs['queryset'] = User.objects.filter(username=request.user.username)
return super(TaskAdmin, self).formfield_for_foreignkey(
db_field, request, **kwargs
)


这样的话,默认用当前用户,并且候选框里只有当前用户,就不需要担心用户选择其他用户了。

总结

django提供了各式各样的接口,但是文档并不是特别全,所以一些用法还是要通过搜搜来搜到

搜索时
4000
用中文尝试后没有好的答案时,要尽早切换到英文,把需求用英文描述下再在谷歌下搜索,这样可以有效提高效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  django admin python 外键