如何将django选择字段与filepathfield结合使用

时间:2016-01-25 18:16:40

标签: python django choicefield

我想用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中手动设置它?

1 个答案:

答案 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')