Django Хранение приложения, различные «upload_to» в зависимости от выбора пользователя - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь реализовать функциональность, где пользователь может загрузить файл и выбрать (в форме), будет ли этот файл глобальным (доступным для всех) или закрытым (доступным только для него). Форма будет выглядеть следующим образом:

r

Сначала я удвоил модель, представление, форму и т. Д. c. где единственная разница была:

file = models.FileField(upload_to=user_directory_path)

и

file = models.FileField(upload_to='global files/')

- это то, что разрушает DRY правило. Очевидно, это не то, чего я хочу достичь.

Итак, я попытался сделать логическое значение в модели и изменил параметр upload_to в зависимости от выбора пользователя:

class FileModel(models.Model):
    title = models.CharField(max_length=50, blank=True)
    uploaded_at = models.DateTimeField(auto_now_add=True)
    file = models.FileField(upload_to=user_directory_path)
    user = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    STATUS = (
      (1, ('Global file')),
      (2, ('My file')),
      )
    status = models.CharField(max_length = 30, choices=STATUS, default=2)
    if status == 'My file':
        file = models.FileField(upload_to=user_directory_path)

    elif status == 'Global file':
        file = models.FileField(upload_to='global files')

К сожалению, это не работает. У кого-нибудь есть идеи, как это реализовать?

1 Ответ

0 голосов
/ 10 апреля 2020

Достаточно одного из них

file = models.FileField(upload_to=user_directory_path)

Вы не хотите разбивать DRY или добавлять бесполезный столбец db, давайте погрузимся в форму

# forms.py 

class MyForm(...):
    ...
    def form_valid(self, form):
       # here you have access to form.data and form.instance (the instance of your model)
       # I'll make it pseudo and you translate to python
       # get what the user chose from form.data in a variable (print it first to see it)
       # edit the form.instance.file depending on it. (instance of your model
       # think of it as my_instance = form.instance)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...