我想用django处理teplates。为此,我需要使用Choicefield和FilePathField。
我真的不知道如何将它们结合起来。表单中的“选择”字段按预期工作
class TaskBlockForm(forms.ModelForm):
""" form used for creating a taskblock
:param forms.ModelForm: superclass of forms.
"""
users = forms.ModelMultipleChoiceField(queryset=DemoUser.objects.all())
upload_by_file = forms.BooleanField()
file = forms.FileField(label=_('Init script'), required=False)
template = forms.ChoiceField(widget=forms.Select(), choices=[(0, 'WorldDB'), (1, 'ArticleDB'), (2, 'SampleDB')])
date = forms.DateField(widget=SelectDateWidget(), label=_('maturity date'), initial=timezone.now())
模型看起来像
def generate_templatename(instance, filename):
"""
helper method to generate path and filename for a template sql file of a taskblock
:param instance: taskblock instance
:param filename: filename
:return: relative url of file path
"""
url = "template/%s/%s" % (instance.name, filename)
return url
class TaskBlock(models.Model):
"""
model of a taskblock
"""
name = models.CharField(max_length=20)
description = models.TextField()
create_stamp = models.DateTimeField(default=timezone.now)
file = models.FileField(upload_to=generate_filename, blank=True)
template = models.FilePathField(path=generate_templatename, default='DEFAULT')
def __str__(self):
return self.name
(文件网址的设置应该是正确的 - 我使用相同的方法在/ media / documents目录中存储文件)
我如何将这两者结合起来,以便我可以直接选择模型?或者我必须在view.py中手动设置它?
答案 0 :(得分:0)
我找到了解决方案。问题在于路径设置。
功能:
def generate_templatename(instance, filename):
"""
helper method to generate path and filename for a template sql file of a taskblock
:param instance: taskblock instance
:param filename: filename
:return: relative url of file path
"""
url = "template/%s/%s" % (instance.name, filename)
return url
无法使用。相反,路径必须设置如下:
template = models.FilePathField(path=settings.MEDIA_ROOT + settings.TEMPLATE_URL,recursive=True)
MEDIA_ROOT在settings.py中定义,并指向/ media目录
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
TEMPLATE_URL = '/templates/'
现在表单可以使用模型而不是定义新的模板变量
template = forms.ChoiceField(widget=forms.Select(), choices=[(0, 'WorldDB'), (1, 'ArticleDB'), (2, 'SampleDB')])
不再使用,只需通过以下方式扩展元设置:
class Meta:
model = TaskBlock
# use following model fields
fields = ('name', 'description', 'template')