Загрузка изображения завершается неудачно, но не выдает ошибку

#python #django #inline-formset

#python #django #встроенный набор форм

Вопрос:

У меня есть две модели, Project которые содержат информацию о проекте и ProjectImage которые содержат все изображения, связанные с этим проектом (отношение «многие к одному»). Я настроил его таким образом, что изображения проекта могут быть загружены во время начальной настройки через встроенный набор форм.

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

Мои вопросы:

1). Есть ли что-нибудь в приведенном ниже коде, что помешало бы загрузке изображения? На мой взгляд, изображения должны загружаться в django_project_dir/media/images .

2). Существуют ли какие-либо инструменты, которые могут помочь мне отладить подобные проблемы в будущем?

Настройка папки:

 folder/
    env/
    project_dir/
        app/
        project_dir/
            settings.py
        media/
            images/
  

Settings.py:

 PROJECT_DIR = os.path.realpath(os.path.dirname(__file__))
MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media')
MEDIA_URL = '/media/'
  

Models.py:

 class ProjectImage(TimeStamp):
    project = models.ForeignKey(Project)
    image = models.ImageField(upload_to='images/')
  

Views.py:

 class CreateProject(CreateView):
    model = Project
    template_name = "manage_project.html"
    form_class = CreateProjectForm

    def get(self, request, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        project_image_form = ProjectImageFormSet()

        return self.render_to_response(
            self.get_context_data(
                form=form,
                project_image_form = project_image_form,
            )
        )

    def post(self, request, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        project_image_form = ProjectImageFormSet(self.request.POST)

        if form.is_valid() and project_image_form.is_valid():
            return self.form_valid(form, project_image_form)
        else:
            return self.form_invalid(form, project_image_form)

    def form_valid(self, form, project_image_form):
        self.object = form.save()
        project_image_form.instance = self.object
        project_image_form.save()

        return HttpResponseRedirect(self.get_success_url())

    def form_invalid(self, form, project_image_form):
        return self.render_to_response(
            self.get_context_data(
                form = form,
                project_image_form = project_image_form,
            )
        )

    def get_success_url(self):
        return reverse('list-project')
  

Forms.py:

 class CreateProjectForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(CreateProjectForm, self).__init__(*args, **kwargs)
        self.fields['name'].label = "Project Name"
        self.fields['description'].label = "Project Description"
        self.fields['github'].label = "Github Link"
        self.fields['public'].label = "Public?"

    class Meta:
        model = Project

ProjectImageFormSet = inlineformset_factory(Project, ProjectImage)
  

Комментарии:

1. Добавить self.request.FILES в экземпляр класса формы.

2. Кроме того, установите enctype="multipart/form-data" в вашем <form>

3. @sk1p да, он уже установлен.

4. @pancakes Как именно я должен это делать? Спасибо за помощь.

5. @ColtonAllen ProjectImageFormSet(self.request.POST, self.request.FILES)