如何使用 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)
我想知道是否有一些简单的方法来拥有 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)