Как получить текущего зарегистрированного пользователя для использования динамического имени файла в модели - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь установить текущий каталог 'upload_to=' равным текущему имени пользователя вошедшего в систему, чтобы каждый загруженный файл сохранялся в собственном каталоге пользователя.

Я пытался следовать документации django , которая выглядит примерно так ...

from django.db import models


def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)


class UploadReports(models.Model):
    upload = models.FileField(upload_to=user_directory_path, null=True)

Я также пытался добавить RequestMiddleware для достижения этой цели, но я чувствовал себя неправильно, когда я его реализовывал.

Я хочу, чтобы он взял текущего зарегистрированного пользователя и использовал его в пути к каталогу. Появляется ошибка: AttributeError at /stylist/ 'UploadReports' object has no attribute 'user'

1 Ответ

2 голосов
/ 21 мая 2019

Решение: В документации Django не указывается пользователь, которого нужно добавить в модель, хотя он этого и ожидает.

Когда это было сделано, модель выглядела так:

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'uploads/{0}/{1}'.format(instance.user.username, filename)


class UploadReports(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    xls = models.FileField(upload_to=user_directory_path)

Если вы добавите сюда пользователя, то НЕ ЗАБУДЬТЕ , чтобы добавить пользователя в поле формы следующим образом:

class DocumentForm(forms.ModelForm):
    class Meta:
        model = UploadReports
        fields = ('xls', 'user')

После добавления поля в форму в шаблоне появляется новое поле со списком возможных пользователей. Как и большинство людей, вероятно, нет, я не хотел, чтобы форма включала пользователя. Поэтому, как указано ilja, вы должны exclude форму как таковую:

class DocumentForm(forms.ModelForm):
    class Meta:
        model = UploadReports
        fields = ('xls', 'user')
        exclude = ('user', ) # make sure this is a tuple

Как только форма будет исключена, она вернется к ошибке, что пользователь не существует. Таким образом, вам нужно добавить пользователя в post методе views.py следующим образом:

class FileUploadView(View):
    form_class = DocumentForm
    success_url = reverse_lazy('home')
    template_name = 'file_upload.html'

    def get(self, request, *args, **kwargs):
        upload_form = self.form_class()
        return render(request, self.template_name, {'upload_form': upload_form})

    def post(self, request, *args, **kwargs):
        upload_form = self.form_class(request.POST, request.FILES)
        if upload_form.is_valid():
            form_done = upload_form.save(commit=False) # save the form but don't commit
            form_done.user = self.request.user # request the user
            form_done.save() # finish saving the form
            return redirect(self.success_url)
        else:
            return render(request, self.template_name, {'upload_form': upload_form})

Это не простая задача, но она полезна, когда она выполнена!

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