#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)