Django不能在已保存的对象中使用upload_to上的pk

时间:2013-02-23 14:34:51

标签: django django-uploads

我在项目中构建了一个向导。 在第一步中,我创建一个对象“Building”并将其保存在db中。 在第二步中,我让用户上传第一步中保存的建筑物的图像。

图片位于建筑模型中。

当我尝试自定义图像的保存路径时,我发现“instance.pk”为None。

如果我尝试访问应该在“实例”中的模型的每个属性,也会发生同样的事情。我可以访问的唯一属性是我在View中手动设置的属性(例如,nome,descrizione,...)

我不透露为什么会发生这种情况。有人可以向我解释一下吗?

模型的一部分:

 class Building(models.Model):
    utente = models.ForeignKey(User);
    nome = models.CharField(max_length=200, unique=True)
    descrizione = models.TextField(max_length=1000, blank=True)
    link = models.URLField(blank=True)
    foto = ImageField(upload_to=content_file_name, blank=True)
    ...

Content_file_name:

 def content_file_name(instance, filename):         
    estensione = '.jpg'       
    posizione_punto = filename.rfind('.')        
    if posizione_punto > 0:
            estensione = filename[posizione_punto:]
    return '/'.join(['buildings', str(instance.pk), 'vetrina'+estensione])

视图的一部分(第二个向导步骤):

 # I load the building from the db
 building = get_object_or_404(Building, pk=b_id)

 if request.method == 'POST':

       form = StepOneForm(request.POST, request.FILES)
       if form.is_valid():
            data = form.save(commit=False)
            building.data_update = datetime.datetime.now()
            building.nome = data.nome
            building.descrizione = data.descrizione
            building.link = data.link
            building.foto = data.foto

            building.save()

            ...

1 个答案:

答案 0 :(得分:0)

首先,您已将foto字段定义为foto = ImageField()它可能应为foto = models.ImageField()

其次,当您启动表单时,您不会包含instance参数(请查看docs)。它应该像 -

form = StepOneForm(request.POST, request.FILES, instance=building)

这就是django如何知道将html表单数据添加到现有实例。如果你声明你的表格 -

from django.forms import ModelForm

class BuildingForm(ModelForm):
    class Meta:
        model = Building

然后当您执行data = form.save(commit=False)时,data变量实际上是Building的实例。如果您已经说过表单与特定实例相关(例如您在视图开头声明的building),那么data将是Building的特定实例

这意味着您可以将视图代码更改为 -

def your_view(request):
    building = get_object_or_404(Building, pk=b_id)
    if request.method == 'POST':
        form = BuildingForm(request.POST, request.FILES, instance=building)
           if form.is_valid():
               building = form.save(commit=False)
               building.save()
    else: #...

查看FormModelForm文档。