Django:自定义“仅添加”内联

时间:2011-05-11 01:31:18

标签: django django-admin django-forms

我希望内联表单只显示其字段内容,不允许用户编辑或删除条目,只需添加它们。这意味着使用readonly_fields选项时值会相似,而底部的“添加另一个...”链接会显示一个表单,让用户添加更多条目。

can_delete选项在这里很有用,但readonly_fields锁定会增加和改变可能性。我想构建一个新的内联模板会有所作为。在这种情况下,我如何只显示每个条目的字段值,然后在底部放置一个表单?

编辑:到目前为止我得到了什么:

# models.py
class AbstractModel(models.Model):
   user = models.ForeignKey(User, editable = False)
  ... some more fields ...
   class Meta:
       abstract = True

class ParentModel(AbstractModel):
   ... fields ...
class ChildModel(AbstractModel):
   parent = models.ForeignKey(ParentModel, ... options ...)
   ... fields ...

# admin.py
class ChildModelInline(admin.TabularInline):
   model = ChildModel
   form = ChildModelForm
   can_delete = False

class ParentModelAdmin(admin.ModelAdmin):
   ... options ...
   inlines = (ChildModelInline,)

# forms.py
class ChildModelForm(models.ModelForm):
   user = forms.CharField(required = False)
   ... some more fields and stuff needed ...

   def __init__(self, *args, **kwargs):
       super(ChildModelForm, self).__init__(*args, **kwargs)
       try: user = User.objects.get(id = self.instance.user_id)
       except: return None
       self.fields['user'].initial = user.first_name
       self.fields['user'].widget.attrs['readonly'] = 'readonly'

在这个例子中我的意思是我希望user字段为readonly。

在最后一行中,如果我将widget属性更改为['disabled'] = True,它可以正常工作,但我需要一个文本条目,而不是一个禁用的表单字段。我也知道我需要覆盖save_model()save_formsets()才能使其正常工作。

1 个答案:

答案 0 :(得分:0)

我会使用extra=1来获取最后一个工作表单。

然后遍历视图中除最后一个之外的所有表单,并像这样更改每个字段:In a Django form, how do I make a field readonly (or disabled) so that it cannot be edited?

您不必在__init__中执行此操作,您可以在创建整个表单集后访问这些属性。