Django - 一对一的模型管理员

时间:2017-05-12 14:46:24

标签: django one-to-one

我熟练使用django并尝试将模型表单用于Intranet项目。

基本上,我有一个“资源”模型,由另一个团队填充。 第二个模型是“Intake”,用户提交资源请求。它与资源有一对一的映射。

目标是每次摄入仅允许1个资源分配。

现在,Intake模型表单显示了表单,其中包含一个资源下拉字段,但需要注意的是它显示了所有资源,无论以前的分配如何。

离。如果摄入量占用资源,则保存按钮会检测到禁止保存。这是预期的,但是下拉列表不应该首先显示该资源。

我该怎么做,即不显示已分配的资源?

class Resource(models.Model):
    label = models.CharField(max_length=50, primary_key=True)
    created = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey('auth.User', default=1)

    class Meta:
        verbose_name_plural = "Resource Pool"

    def __str__(self):
        return self.label

class Intake(models.Model):
    order_id = models.AutoField(primary_key=True)
    requestor = models.ForeignKey('auth.User', default=1)
    resource = models.OneToOneField(Resource, verbose_name="Allocation")
    project = models.CharField(max_length=50)

    class Meta:
        verbose_name_plural = "Environment Request"

    def __str__(self):
        print("self called")
        return self.project

enter image description here

2 个答案:

答案 0 :(得分:3)

您可以在管理员中创建自定义表单,并更改resource字段的查询集值。像这样:

<强> admin.py

from django import forms
from django.db.models import Q

from .models import Intake

class IntakeForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(IntakeForm, self).__init__(*args, **kwargs)
        self.fields['resource'].queryset = Resource.objects.filter(
            Q(intake__isnull=True) | Q(intake=self.instance)
        )

class IntakeAdmin(admin.ModelAdmin):
    form = IntakeForm

admin.site.register(Intake, IntakeAdmin)

答案 1 :(得分:2)

您可以在字段定义中使用if flag=1: $('#your-btn').addClass('btn-disabled'); else: $('#your-btn').removeClass('btn-disabled');

limit_choices_to