Доступ к свойствам ForeignKey - PullRequest
1 голос
/ 03 августа 2011

У меня две модели.По сути, я расширяю это обсуждение: Несколько изображений на модель Я хотел бы получить значение machine_name модели Design и использовать его при создании пути для ImageField upload_to в модели DesignImage.Что-то с эффектом: image = models.ImageField(upload_to='designs/' + design.get_machine_name + '/images')

Это приводит к следующей ошибке: AttributeError: 'ForeignKey' object has no attribute 'get_machine_name'.

Надеюсь, приведенный ниже код понятен.

from django.db import models
from django.db.models.fields.related import ManyToManyField
from django.template.defaultfilters import slugify

class Design(models.Model):
    name = models.CharField(max_length=30, help_text='Name of the design.')
    machine_name = models.SlugField(editable=False)

    def save(self, *args, **kwargs):
        self.machine_name = slugify(self.name)
        super(Design, self).save(*args, **kwargs)

    def get_machine_name(self):
        return self.machine_name

    def __unicode__(self):
        return self.name

class DesignImage(models.Model):

    def get_upload_dir(self):
        return 'designs/' + self.design.machine_name + '/images'

    design = models.ForeignKey(Design, related_name='images')
    caption = models.CharField(max_length=100)
    image = models.ImageField(upload_to='designs/' + design.get_machine_name + '/images')

    def __unicode__(self):
        return self.caption

Я включил следующий код на случай, если он может быть полезен:

from designs.models import *
from django.contrib import admin

class DesignImageInline(admin.TabularInline):
    model = DesignImage
    extra = 3 # number of extra inline form fields to display

class DesignAdmin(admin.ModelAdmin): 
    inlines = [ DesignImageInline, ]

admin.site.register(Design, DesignAdmin)
admin.site.register(DesignImage)

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Если местоположение, куда загружается ImageField, зависит от экземпляра (как здесь), аргумент upload_to может вызываться вместо строки, в которой ему передается текущий экземпляр иимя файла.Вам нужно что-то вроде этого:

import os 

def upload_to(instance, filename):
    return os.path.join('designs', instance.design.machine_name, 'images', filename)

...
    image = models.ImageField(upload_to=upload_to)
1 голос
/ 03 августа 2011

Проблема в этой строке:

image = models.ImageField (upload_to = 'designs /' + design.get_machine_name + '/ images')

Дизайн поля не определяется во время компиляции, это еще одно поле в модели.

Вам нужно будет применить это во время выполнения в каждой форме, которую вы используете для редактирования.

...