Решение: В документации 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})
Это не простая задача, но она полезна, когда она выполнена!