我想在Django的管理员中为这样的模型实现“另存为新”功能:
class Plasmid (models.Model):
name = models.CharField("Name", max_length = 255, blank=False)
other_name = models.CharField("Other Name", max_length = 255, blank=True)
selection = models.CharField("Selection", max_length = 50, blank=False)
created_by = models.ForeignKey(User)
在管理员中,如果请求质粒对象的用户与创建它的用户不同,则上述某些字段将设置为只读。如果用户相同,则它们都是可编辑的。例如:
class PlasmidPage(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
if obj:
if not request.user == obj.created_by:
return ['name', 'created_by',]
else:
return ['created_by',]
else:
return []
def change_view(self,request,object_id,extra_context=None):
self.fields = ('name', 'other_name', 'selection', 'created_by',)
return super(PlasmidPage,self).change_view(request,object_id)
我遇到的问题是,当一个字段是只读的并且用户点击“另存为新”按钮时,该字段的值不会“转移”到新对象。另一方面,传输非只读字段的值。
有人为什么,或者我如何解决这个问题?我想将只读和非只读字段的值传递给新对象。
你尝试过 Field.disabled属性吗?
禁用的boolean参数设置为True时,将使用禁用的HTML属性禁用表单字段,以便用户无法编辑它。即使用户篡改了提交给服务器的字段值,也会忽略该表单的初始数据中的值。
我在我的项目中做了一个快速测试。当我添加新条目时,已禁用的字段被发送到服务器。所以这样的事情对你有用:
class PlasmidPage(admin.ModelAdmin):
def get_form(self, request, *args, **kwargs):
form = super(PlasmidPage, self).get_form(request, *args, **kwargs)
if not request.user == self.cleaned_data['created_by'].:
form.base_fields['created_by'].disabled = True
form.base_fields['name'].disabled = True
def change_view(self,request,object_id,extra_context=None):
self.fields = ('name', 'other_name', 'selection', 'created_by',)
return super(PlasmidPage,self).change_view(request,object_id)