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':'''}]
我现在得到的文本框没有选择,所以我无法引用我想要的语言。我现在正在处理整型错误。我想我解释得更好了,我现在得到的文本框没有选择,所以我无法引用我想要的语言。我现在正在处理整型错误。我想我解释得更好