【问题标题】:Remove the selected option from the choice field in admin panel从管理面板的选择字段中删除选定的选项
【发布时间】:2019-07-18 00:26:47
【问题描述】:

如果选择一次,我想减少管理面板中的选择选项。

admin.py

class MyModelForm(forms.ModelForm):
    LOC = [('op1', 'op1'), ('op2', 'op2'),...]

    location = forms.ChoiceField(choices=LOC)


class DataModelAdmin(admin.ModelAdmin):
    form = MyModelForm
    list_display = ('location',)
    search_fields = ['location']

    def get_ordering(self, request):
        return ['location']


admin.site.register(DataModel, DataModelAdmin)

模型.py

class DataModel(models.Model):
    location = models.CharField(max_length=50, unique=True)

    def __str__(self):
        return self.location

我正在尝试这样做,但它会删除重新启动服务器时选择的选项

【问题讨论】:

  • 我不明白你在做什么。您正在尝试删除一个选项而不重启服务/服务器或什么?
  • 你能举个例子解释一下吗?
  • DataModel 我有一个独特的位置字段。因此,一旦我从LOC = [('op1', 'op1'), ('op2', 'op2'),...] 中选择了选项op2,那么下次LOC 仅具有这些选项[('op1'), ('op3'), ('op4'),...]
  • 是的@tukan,我正在尝试删除一个选项而不重启服务/服务器

标签: django django-2.1


【解决方案1】:

如果我正确解释了您的问题,您想从字段选择中删除对象的位置...

class MyModelForm(forms.ModelForm):
    LOC = [('op1', 'op1'), ('op2', 'op2')]

    location = forms.ChoiceField()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if self.instance:
            self.fields['location'].choices = [
                choice for choice in self.LOC
                if choice[0] != self.instance.location
            ]
        else:
            self.fields['location'].choices = self.LOC

实际上,在第二次阅读时,您可能正在寻找filter

from django.contrib.admin import SimpleListFilter

class LocationFilter(SimpleListFilter):
    title = 'location'
    parameter_name = 'location'

    def lookups(self, request, model_admin):
        locations = DataModel.objects.values_list('location', flat=True)
        return locations

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(location=self.value())

然后将list_filter = (LocationFilter,) 添加到您的管理类。

【讨论】:

    【解决方案2】:

    通过将 init 添加到 MyModelForm 类,您可以删除选择字段中的选项

    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)
        item = [i.location for i in DataModel.objects.all()]
        if self.instance.id:
            item.remove(self.instance.location)
        self.fields['location'].choices = [(i, j) for i, j in self.LOC if i not in item]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-18
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 2010-12-21
      • 1970-01-01
      • 2019-01-07
      相关资源
      最近更新 更多