0

プロジェクトにウィザードを作成しました。最初のステップでは、オブジェクト「Building」を作成してデータベースに保存します。2番目のステップでは、最初のステップで保存した建物の画像をユーザーにアップロードさせます。

画像は建物のモデルにあります。

画像の保存パスをカスタマイズしようとすると、「instance.pk」が「なし」であることがわかりました。

「インスタンス」にあるはずのモデルのすべての属性にアクセスしようとすると、同じことが起こります。アクセスできる属性は、ビューで手動で設定した属性のみです(例: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])

ビューの一部(ウィザードの2番目のステップ):

 # 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)すると、実際にはのインスタンスになります。また、フォームが特定のインスタンスに関連していると既に述べている場合(たとえば、ビューの最初で宣言する場合)、はその特定のインスタンスになります。dataBuildingbuildingdataBuilding

これは、ビューコードを-に変更できることを意味します

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

フォームModelFormドキュメントをご覧ください。

于 2013-02-23T15:19:38.113 に答える