Django无法在尚未保存的对象中使用pk on upload_to

Django无法在尚未保存的对象中使用pk on upload_to,django,django-uploads,Django,Django Uploads,我在我的项目中构建了一个向导。 在第一步中,我创建一个对象“Building”,并将其保存在db中。 在第二步中,我让用户上传第一步中保存的建筑物图像 图像在建筑物的模型中 当我尝试自定义图像的保存路径时,我发现“instance.pk”是None 如果我尝试访问模型中应该在“实例”中的每个属性,也会发生同样的情况。我可以访问的唯一属性是我在视图中手动设置的属性(例如nome、descripione等) 我不明白为什么会发生这种事。谁能给我解释一下吗 模型的一部分: class Buildin

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

图像在建筑物的模型中

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

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

我不明白为什么会发生这种事。谁能给我解释一下吗

模型的一部分:

 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])
视图的一部分(向导的第二步):


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

其次,当您启动表单时,您没有包含
实例
参数(请看下面的例子)。应该是这样的-

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
变量实际上是
构建的一个实例。如果您已经说过表单与特定实例相关(例如在视图开头声明的
建筑
),那么
数据
将是
建筑
的特定实例

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

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: #...

查看和文档。

了解1。重点是,我使用的是sorl.thumbnail,参见这里的2,我不知道它与我的问题有什么关系:我正在处理从表单到“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: #...