Mat*_*ten 3 django django-models django-forms django-admin
我有3个型号:
class FileType(models.Model):
name=models.CharField(max_length=128)
class ManagedFile(models.Model):
type = models.ForeignKey(FileType)
content = models.FileField(upload_to=path_maker)
class Tag(models.Model):
type = models.ForeignKey(FileType)
m_file = models.ForeignKey(ManagedFile)
def clean(self):
if self.m_file is None:
return
if self.type != self.m_file.type:
raise ValidationError("File type does not match Tag type")
Run Code Online (Sandbox Code Playgroud)
为标签选择m_file时,m_files类型必须与“标签”类型匹配。这一切都很好,但是Tag.m_file的管理员下拉列表显示了所有类型的文件,而与Tag的类型无关。这使用户感到困惑。
在我看来,有很多方法可以静态过滤下拉列表。因此,如果我想说我们永远不会让用户在下拉列表中看到Type.pk = 1,我可以做到这一点。但是似乎没有一种方法可以对m_file.Type == Self.Type进行过滤
动态创建管理表单类实际上很容易。这样的事情应该起作用:
def tagform_factory(filetype):
class TagForm(forms.ModelForm):
m_file = forms.ModelChoiceField(
queryset=ManagedFile.objects.filter(type=filetype)
)
return TagForm
class TagAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if obj is not None and obj.type is not None:
kwargs['form'] = tagform_factory(obj.type)
return super(TagAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)
请注意,该get_form方法负责构建表单类,而不是表单实例。它的名字不好,恕我直言。
但是,您仍然需要决定对用于添加新标签的表单要做什么,而不是编辑现有标签。在那种情况下,您还没有可以限制下拉列表的类型。也许这里确实存在一个数据建模问题?您真的需要模型中的type字段Tag吗?也许应该将其删除?
| 归档时间: |
|
| 查看次数: |
3396 次 |
| 最近记录: |