具有只读旧值并允许添加新内联值的 Django 管理内联表单
Django admin inline form with readonly old values and allowing to add new inline values
我正在尝试解决这个问题,但出于某种原因,到目前为止每次尝试都失败了。我有两个简单的模型:问题和答案:
class Question(models.Model):
phoneID = models.CharField(max_length=255, editable=False)
name = models.CharField(max_length=255, editable=False)
phone = models.CharField(max_length=255, editable=False)
message = models.TextField(editable=False)
answered = models.DateTimeField(editable=False)
created = models.DateTimeField(auto_now_add=True, default=datetime.utcnow())
class Answer(models.Model):
question = models.ForeignKey(Question)
message = models.TextField()
created = models.DateTimeField(auto_now_add=True, default=datetime.utcnow())
出于某种原因,我无法弄清楚我应该在我的 admin.py 中放入什么,以便将之前添加的答案内联列为只读,同时允许添加内联新答案。每次我设置 readonly_fields=('message') 我都无法添加新答案,因为消息文本区域是只读的。
Django 1.7 允许您在管理内联中显示对象的 属性。
class AnswerInline(admin.TabularInline):
model = Answer
fields = ('message', 'message_display', )
readonly_fields=('message_display', )
def message_display(self, obj):
return obj.message
好的,我明白你的意思了。为此,您可以创建一个特殊的小部件,它将显示字段值,同时将是一个隐藏的输入。使用此小部件获取以前的答案:
from django.forms.widgets import Widget
from django.forms.utils import flatatt
from django.utils.html import format_html
class ReadOnlyInput(Widget):
def render(self, name, value, attrs=None):
if value is None:
value = ''
final_attrs = self.build_attrs(attrs, type='hidden',
name=name, value=value)
return format_html('<input{} />{}', flatatt(final_attrs), value)
class AnswerForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(AnswerForm, self).__init__(*args, **kwargs)
if self.instance.pk:
self.fields['message'].widget = ReadOnlyInput()
class AnswerInline(admin.TabularInline):
form = AnswerForm
model = Answer
今天有同样的问题。首先是尝试修改 form
,然后是 get_readonly_fields
,然后是许多其他内容。然后想起了这件优雅的事:
class MyInline(admin.StackedInline):
def has_change_permission(self, request, obj=None):
return False
我正在尝试解决这个问题,但出于某种原因,到目前为止每次尝试都失败了。我有两个简单的模型:问题和答案:
class Question(models.Model):
phoneID = models.CharField(max_length=255, editable=False)
name = models.CharField(max_length=255, editable=False)
phone = models.CharField(max_length=255, editable=False)
message = models.TextField(editable=False)
answered = models.DateTimeField(editable=False)
created = models.DateTimeField(auto_now_add=True, default=datetime.utcnow())
class Answer(models.Model):
question = models.ForeignKey(Question)
message = models.TextField()
created = models.DateTimeField(auto_now_add=True, default=datetime.utcnow())
出于某种原因,我无法弄清楚我应该在我的 admin.py 中放入什么,以便将之前添加的答案内联列为只读,同时允许添加内联新答案。每次我设置 readonly_fields=('message') 我都无法添加新答案,因为消息文本区域是只读的。
Django 1.7 允许您在管理内联中显示对象的 属性。
class AnswerInline(admin.TabularInline):
model = Answer
fields = ('message', 'message_display', )
readonly_fields=('message_display', )
def message_display(self, obj):
return obj.message
好的,我明白你的意思了。为此,您可以创建一个特殊的小部件,它将显示字段值,同时将是一个隐藏的输入。使用此小部件获取以前的答案:
from django.forms.widgets import Widget
from django.forms.utils import flatatt
from django.utils.html import format_html
class ReadOnlyInput(Widget):
def render(self, name, value, attrs=None):
if value is None:
value = ''
final_attrs = self.build_attrs(attrs, type='hidden',
name=name, value=value)
return format_html('<input{} />{}', flatatt(final_attrs), value)
class AnswerForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(AnswerForm, self).__init__(*args, **kwargs)
if self.instance.pk:
self.fields['message'].widget = ReadOnlyInput()
class AnswerInline(admin.TabularInline):
form = AnswerForm
model = Answer
今天有同样的问题。首先是尝试修改 form
,然后是 get_readonly_fields
,然后是许多其他内容。然后想起了这件优雅的事:
class MyInline(admin.StackedInline):
def has_change_permission(self, request, obj=None):
return False