СУХОЙ подход к доступу к значению экземпляра в пользовательском поле формы Django ImageField? - PullRequest
2 голосов
/ 23 марта 2011

Я использую django-storages для сохранения изображений, загруженных на S3, и я хочу создать настраиваемое поле формы, которое будет отображать изображение при редактировании вместе с возможностью его изменения.

Проблема, с которой я сталкиваюсь, заключается в том, что значение пути, которое хранится в моей базе данных, не является полным путем к изображению, поскольку django-хранилища генерирует полный путь.

Settings.py:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_STORAGE_BUCKET_NAME = 'myBucketName'
AWS_LOCATION = 'mySubBucketName'

models.py:

class MyModel(models.Model):
    my_image = ImageField(upload_to='upload/path')

Пример доступа к полному URL:

>>> mymod = MyModel.objects.get(id=1)
>>> print mymod.my_image
upload/path/somefile.jpg
>>> print mymod.my_image.url
https://s3.amazonaws.com/myBucketName/mySubBucketName/upload/path/somefile.jpg

Я не вижу, как я могу получить доступ к mymod.my_image.url () из пользовательского виджета (где я буду отображать () что-то вроде этого:

class ImageViewWidget(forms.Widget):
    markup = """
        <img src="%(imagepath)"/>
        <input type="file" name="%(name)s"/>
        """

    def render(self, name, value, attrs=None):
        output = self.markup % {
            "name": name,
            "imagepath": "<<<< MAGIC CODE GOES HERE >>>>"
        }
        return mark_safe(output)

Обновление:
Я ищуСУХОЙ подход к этой проблеме. Мои извинения за то, что не разъяснили это с самого начала

Ответы [ 2 ]

2 голосов
/ 24 марта 2011

Я думаю, что переопределение __init__ в вашем пользовательском виджете и передача в вашем URL позволят вам сделать это.

edit:

class ImageViewWidget(forms.Widget):
    def __init__(self, *args, **kwargs):
        self.path = kwargs.pop('path', '')
        super(ImageViewWidget, self).__init__(*args, **kwargs)

    markup = """
        <img src="%(imagepath)"/>
        <input type="file" name="%(name)s"/>
        """

    def render(self, name, value, attrs=None):
        output = self.markup % {
            "name": name,
            "imagepath": self.path
        }
        return mark_safe(output)

class MyModelForm(ModelForm):
    class Meta:
        model = MyModel

    def __init__(self, *args, **kwargs):
        image_url = ''
        if self.instance:
            image_url = self.instance.my_image.url
        super(MyModelForm, self).__init__(*args, **kwargs)

        self.fields['my_image'].widget=ImageViewWidget(path=image_url)
0 голосов
/ 05 апреля 2011

Если вы используете ModelForm для генерации формы, отображаемой с использованием виджета, вы можете передать значение в виджет, требуется один раз написать код.

from django.forms import ModelForm, Textarea

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title', 'birth_date')
        widgets = {
            'name': Textarea(attrs={'cols': 80, 'rows': 20}),
        }

Так что в вашем случае это может быть:

class MyModelForm(ModelForm):
     class Meta:
          model = MyModel
     def __init__(self, *args, **kwargs):
          image_url = ''
    if self.instance:
        image_url = self.instance.my_image.url
        super(MyModelForm, self).__init__(*args, **kwargs)

        self.fields['my_image'].widget=ImageViewWidget(path=image_url)

self.instance должен предоставлять доступ к модели, если она была установлена ​​при создании ModelForm.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...