2013-02-23 34 views
0

我已經建立在我的項目的嚮導。 在第一步中,我創建一個「Building」對象並將其保存在數據庫中。 在第二步中,我讓用戶上傳第一步中保存的建築物的圖像。Django中不能使用的upload_to PK中的對象尚未保存

的圖像是在大樓的模型。

當我嘗試定製圖像的保存路徑,我發現「instance.pk」莫屬。

同樣的事情發生,如果我嘗試訪問模式,應在「實例」的每個屬性。我可以訪問的唯一屬性是那些我在View手動設置(例如:諾姆,descrizione,...)

我不undersant爲什麼發生這一點。有人可以向我解釋嗎?模型的

部分:

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:

視圖(第2嚮導步驟)
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

首先,已經定義了你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文檔。

+0

對於第1點,我使用sorl.thumbnail,請參閱此處的[docs](http://sorl-thumbnail.readthedocs.org/en/latest/examples.html#model-examples) 2.我不明白它與我的問題有什麼關係:我正在處理從窗體到「建築物」對象的數據... – 2013-02-23 15:26:46

+0

好吧,現在我明白了...... 謝謝你的幫助! – 2013-02-23 15:37:36

+0

沒問題 - 很高興你能工作! – 2013-02-23 16:08:38