我在项目中构建了一个向导。 在第一步中,我创建一个对象“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()
...
答案 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: #...