是否可以禁用Django管理员中的字段?

时间:2018-02-21 14:15:34

标签: python django django-models django-admin

我现在给你我的例子,因为它太难解释,好吧,我不知道XD。我有一个名为Step的对象:

class Step(models.Model):
    # Intitulé de la question
    title = models.CharField(max_length=300)
    # Appartenance
    belonging = models.ForeignKey('Survey', blank=True, null=True)
    # Renvoi à lui-même pour arborescence
    parent = models.ForeignKey('self', blank=True, null=True)
    # Ordre de la réponse
    order = models.PositiveIntegerField(default=0)
    # Complément d'information
    add_info = models.TextField(blank=True, verbose_name="Additional informations")

    def __str__(self):
        return (self.title)

    def children(self):
        return Step.objects.filter(parent=self, belonging=self.belonging).order_by('order', 'title')

    def render_step(self):
        template = get_template('app_questionnaire/_step.html')
        return template.render({'step': self})

我有一步没有父母,只有一步。我只是想知道在添加Step后是否可以在Django管理员中禁用EMPTY父字段?我想在没有父母的情况下添加其他步骤与父级,但不是另一步。我不知道你是否知道我的意思:)。

提前谢谢!

4 个答案:

答案 0 :(得分:2)

我并不完全得到你想做的事,但是你可以排除字段或将特定字段声明为只读:

class StepOver(admin.TabularInline):
       model = Step
       exclude = ['parent']
       readonly_fields=('parent', )

答案 1 :(得分:1)

您可以覆盖模型中的保存方法

<强>实施例

def save(self):
    if Step.objects.count() > 1:
        if not self.parent:
            print("Error")
        else:
            super(Step, self).save()

答案 2 :(得分:1)

您可以通过覆盖get_form中的ModelAdmin方法来执行此操作:

class StepModelAdmin(admin.ModelAdmin):

    def get_form(self, request, obj=None, **kwargs):
        form = super(StepModelAdmin, self).get_form(request, obj, **kwargs)

        if Step.objects.count() > 1:

            # this will hide the null option for the parent field
            form.base_fields['parent'].empty_label = None

        return form

答案 3 :(得分:1)

我要感谢@Peter的答案,我只是根据我的问题修改了代码,所以如果有人需要我就给它!

class StepAdmin(admin.ModelAdmin):

      def get_form(self, request, obj=None, **kwargs):
           form = super(StepAdmin, self).get_form(request, obj, **kwargs)

           if Step.objects.filter(parent__isnull=True).count() > 1:

                # this will hide the null option for the parent field
                form.base_fields['parent'].empty_label = None

           return form