0

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

图像在建筑物的模型中。

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

如果我尝试访问应该在“实例”中的模型的每个属性,也会发生同样的事情。我可以访问的唯一属性是我在视图中手动设置的属性(例如 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)
    ...

内容文件名:

 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()

            ...
4

1 回答 1

0

首先,您已经定义了您的foto字段,因为foto = ImageField()它可能应该是 foto = models.ImageField()

其次,当您启动表单时,您不包括instance参数(查看文档)。它应该是这样的 -

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文档。

于 2013-02-23T15:19:38.113 回答