Python 如何将django选项字段与filepathfield组合

Python 如何将django选项字段与filepathfield组合,python,django,choicefield,Python,Django,Choicefield,我想用django加工铁板。为此,我需要使用Choicefield和FilePathField 我真的不知道如何组合它们。表单中的选择字段按预期工作 class TaskBlockForm(forms.ModelForm): """ form used for creating a taskblock :param forms.ModelForm: superclass of forms. """ users = forms.ModelMultipleCh

我想用django加工铁板。为此,我需要使用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
(文件url的设置应该正确-我使用相同的方法将文件存储在/media/documents目录中)


如何将这两者结合起来,以便直接选择模型?或者我以后必须在view.py中手动设置吗?

我找到了解决方案。问题是路径设置

职能:

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)
媒体根目录在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')