如何使用 table 中的所有对象作为标签 - 在 Django 的管理模型中输入?

How can I use all objects in a table as a label - input in a model in Django's Admin?

我想知道是否有一些简单的方法来拥有 2 个模型,例如 Language 和 Word。我们还有另一个模型翻译,其中包含翻译字符串,并且两个模型都使用外键引用。

假设我会两种语言,英语和西班牙语。有什么方法可以使每种语言始终显示为标签,而翻译字符串始终显示为文本框?

如果我正确理解你的问题,我认为你应该看看 inlines

例如,假设您有以下型号。

class Language(models.Model):
    name = models.CharField()

class Word(models.Model):
    value = models.CharField()
    translations = models.ManyToMany(Language, through='Translation')

class Translation(models.Model):
    language = models.ForeignKey(Language)
    word = models.ForeignKey(Word)
    value = models.CharField()

然后你可以在你的 admin.py:

class TranslationInline(admin.TabularInline):
    model = Translation
    readonly_fields = ['language']

    def get_max_num(self, *args, **kwargs):
        return Language.objects.all().count()

    def get_min_num(self, *args, **kwargs):
        return self.get_max_num(*args, **kwargs)

    def get_initial(self, request):
        return [
            {'language': l}
            for l in Language.objects.exclude(pk__in=self.get_queryset(request))
        ]

@admin.register(Word)
class WordAdmin(admin.ModelAdmin):
    inlines = [TranslationInline]

    def _create_formsets(self, request, obj, change):
        formsets = []
        inline_instances = []
        prefixes = {}
        get_formsets_args = [request]
        if change:
            get_formsets_args.append(obj)
        for FormSet, inline in self.get_formsets_with_inlines(*get_formsets_args):
            prefix = FormSet.get_default_prefix()
            prefixes[prefix] = prefixes.get(prefix, 0) + 1
            if prefixes[prefix] != 1 or not prefix:
                prefix = "%s-%s" % (prefix, prefixes[prefix])
            formset_params = {
                'instance': obj,
                'prefix': prefix,
                'queryset': inline.get_queryset(request),
            }
            if hasattr(inline, 'get_initial'):
                formset_params['initial'] = inline.get_initial(request)
            if request.method == 'POST':
                formset_params.update({
                    'data': request.POST,
                    'files': request.FILES,
                    'save_as_new': '_saveasnew' in request.POST
                })
            formsets.append(FormSet(**formset_params))
            inline_instances.append(inline)
        return formsets, inline_instances

这将使您能够 add/edit 在管理员中翻译单词。

如果您在字段属性中设置editable=False,该字段在管理中将是只读的。例如:

language = models.ForeignKey(Language, editable=False)