mps*_*pso 13 django django-admin
我正在尝试在Django的TabularInline类中使用get_readonly_fields:
class ItemInline(admin.TabularInline):
    model = Item
    extra = 5
    def get_readonly_fields(self, request, obj=None):
        if obj:
            return ['name']
        return self.readonly_fields
此代码取自另一个StackOverflow问题: Django管理站点:阻止字段被编辑?
但是,当它放在TabularInline类中时,新的对象表单无法正确呈现.目标是使某些字段只读,同时仍然允许在新对象中输入数据.任何解决方法或不同策略的想法?
小智 5
作为此问题的解决方法,我已将表单和小部件关联到我的内联:
管理.py:
...
class MasterCouponFileInline(admin.TabularInline):
    model = MasterCouponFile
    form = MasterCouponFileForm
    extra = 0
在 Django 2.0 中:
表格.py
from django import forms
from . import models
from feedback.widgets import DisablePopulatedText
class FeedbackCommentForm(forms.ModelForm):
    class Meta:
        model = models.MasterCouponFile
        fields = ('Comment', ....)
        widgets = {
            'Comment':  DisablePopulatedText,
        }
在小部件.py
from django import forms
class DisablePopulatedText(forms.TextInput):
    def render(self, name, value, attrs=None, renderer=None):
        """Render the widget as an HTML string."""
        if value is not None:
            # Just return the value, as normal read_only fields do
            # Add Hidden Input otherwise the old fields are still required
            HiddenInput = forms.HiddenInput()
            return format_html("{}\n"+HiddenInput.render(name, value), self.format_value(value))
        else:
            return super().render(name, value, attrs, renderer)
较旧的 Django 版本:
表格.py
....
class MasterCouponFileForm(forms.ModelForm):
    class Meta:
        model = MasterCouponFile       
    def __init__(self, *args, **kwargs):
        super(MasterCouponFileForm, self).__init__(*args, **kwargs)
        self.fields['range'].widget = DisablePopulatedText(self.instance)
        self.fields['quantity'].widget = DisablePopulatedText(self.instance)
在小部件.py
...
from django import forms
from django.forms.util import flatatt
from django.utils.encoding import force_text
class DisablePopulatedText(forms.TextInput):
    def __init__(self, obj, attrs=None):
        self.object = obj
        super(DisablePopulatedText, self).__init__(attrs)
    def render(self, name, value, attrs=None):
        if value is None:
            value = ''
        final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
        if value != '':
            # Only add the 'value' attribute if a value is non-empty.
            final_attrs['value'] = force_text(self._format_value(value))
        if "__prefix__" not in name and not value:
            return format_html('<input{0} disabled />', flatatt(final_attrs))
        else:
            return format_html('<input{0} />', flatatt(final_attrs))
dro*_*oon -2
你走在正确的轨道上。使用您想要设置为只读的字段的元组更新 self.readonly_fields 。
class ItemInline(admin.TabularInline):
    model = Item
    extra = 5
    def get_readonly_fields(self, request, obj=None):
        # add a tuple of readonly fields
        self.readonly_fields += ('field_a', 'field_b')
        return self.readonly_fields
| 归档时间: | 
 | 
| 查看次数: | 4250 次 | 
| 最近记录: |