Python 如何将表中的所有对象用作Django';谁是管理员?

Python 如何将表中的所有对象用作Django';谁是管理员?,python,django,admin,models,Python,Django,Admin,Models,我想知道是否有一些简单的方法来创建两个模型,例如语言和单词。我们还有另一个模型翻译,它有翻译字符串,两个模型都用外键引用 假设我有两种语言,英语和西班牙语。有没有办法让每种语言都以标签的形式出现,翻译的字符串以文本框的形式出现 如果我正确理解了你的问题,我想你应该看看 例如,假设您有以下模型 class Language(models.Model): name = models.CharField() class Word(models.Model): value = mode

我想知道是否有一些简单的方法来创建两个模型,例如语言和单词。我们还有另一个模型翻译,它有翻译字符串,两个模型都用外键引用


假设我有两种语言,英语和西班牙语。有没有办法让每种语言都以标签的形式出现,翻译的字符串以文本框的形式出现

如果我正确理解了你的问题,我想你应该看看

例如,假设您有以下模型

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

这将使您能够在管理中添加/编辑单词的翻译。

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

例如,假设您有以下模型

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

这将使您能够在管理中添加/编辑单词的翻译。

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


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

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



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

不确定您想要什么,但Django对i18n和l10n有广泛的支持,请在文档中搜索国际化和本地化。不,我不是在搜索i18n,它只是一个示例。谢谢。我不明白你在问什么。你能说得更清楚些吗?我想在管理界面的翻译形式中有一个标签,上面有我插入的每种语言,还有一个文本框,显示它的值。够清楚吗?对不起,我的英语不太好。我不知道你想要什么,但Django对i18n和l10n有广泛的支持,请在文档中搜索国际化和本地化。不,我不是在搜索i18n,它只是一个示例。谢谢。我不明白你在问什么。你能说得更清楚些吗?我想在管理界面的翻译形式中有一个标签,上面有我插入的每种语言,还有一个文本框,显示它的值。够清楚吗?对不起,我的英语不好。谢谢你,我以前就知道这件事。这为您提供了对每种“语言”的选择。我想要相同的,但我不想选择每种语言。我想为已经插入数据库的所有语言添加翻译。这就是我写标签文本框的意思。我的意思是,如果我有西班牙语和英语,它应该显示一个标签,上面写着“西班牙语”和一个文本框,英语也一样。说真的,很抱歉我的解释不好,非常感谢。您可以将“语言”设置为
readonly\u field
,并通过覆盖
get\u formset()
提供初始数据。让我编辑我的帖子。我编辑了我的答案。这样的办法应该行得通。很明显,这只是一个例子来展示这个想法,我没有测试它。我理解你在假装什么,但这不起作用。它输出下一个错误:
inlineformset_factory()得到了一个意外的关键字参数'initial'
,initial的输出如下
[{'language':,'value':'},{'language':,'value':''},{'language':,'value':''}]
谢谢,我以前就知道这件事。这为您提供了对每种“语言”的选择。我想要相同的,但我不想选择每种语言。我想为已经插入数据库的所有语言添加翻译。这就是我写标签文本框的意思。我的意思是,如果我有西班牙语和英语,它应该显示一个标签,上面写着“西班牙语”和一个文本框,英语也一样。说真的,很抱歉我的解释不好,非常感谢。您可以将“语言”设置为
readonly\u field
,并通过覆盖
get\u formset()
提供初始数据。让我编辑我的帖子。我编辑了我的答案。这样的办法应该行得通。很明显,这只是一个例子来展示这个想法,我没有测试它。我理解你在假装什么,但这不起作用。它输出下一个错误:
inlineformset_factory()得到一个意外的关键字参数'initial'
顺便说一下,initial的输出如下
[{'language':,'value':''},{'language':,'value':''},{'language':,'value':'''}]
我现在得到的文本框没有选择,所以我无法引用我想要的语言。我现在正在处理整型错误。我想我解释得更好了,我现在得到的文本框没有选择,所以我无法引用我想要的语言。我现在正在处理整型错误。我想我解释得更好