#python #django
#python #django
Вопрос:
В моем шаблоне есть форма, подобная этой :
<form action="." method="GET" style="font-family: Tahoma; font-size: 12px">
<table style="width: 100%;">
<tr>
<td>
name:
</td>
<td>
<input id="name" name="name" type="text"/>
</td>
</tr>
<tr>
<td>
<label>capacity :</label>amp;nbsp;</td>
<td>
<input id="capacity" name="capacity" type="text" />
</td>
</tr>
<tr>
<td>
<label>picture:</label>
</td>
<td>
<input type="file" name="imageName_1" id="1"/></a>
</div>
</td>
</tr>
<tr>
<td>
amp;nbsp;
</td>
<td>
<input id="add" type="button" value="save"/>
</td>
</tr>
</table>
</form>
Я хочу получить 2 поля и изображение, а затем сохранить их в приведенной ниже модели:
class Tour(models.Model):
Name=models.CharField(max_length=100)
capacity=models.SmallIntegerField()
image=models.ImageField(upload_to="gallery")
как я могу сохранить это изображение из моего шаблона через представление?
Ответ №1:
У вас есть конкретная проблема с тем, как django объясняет, как это сделать? https://docs.djangoproject.com/en/dev/topics/http/file-uploads /
Прежде всего, вам нужно назначить enctype="multipart/form-data"
внутри <form>
тега.
Если вы должны сделать это вручную, вместо того, чтобы использовать возможности структуры форм Django, вам необходимо вручную назначить данные файла / поля вашей модели.
def myview(request):
image = request.FILES['imageName_1']
tour = Tour()
tour.Name = request.POST.get('name')
tour.capacity = request.POST.get('capacity')
tour.image.save(image.name, image)
tour.save()
Я бы рекомендовал проверить ModelForms django в качестве комбинации представления / шаблона, которая делает это и многое другое (проверка ошибок / повторное отображение), может быть написано за одну минуту.
class MyForm(forms.ModelForm):
class Meta:
model = Tour
def myview(self):
if request.method == 'POST':
form = MyForm(request.POST, request.FILES)
if form.is_valid():
form.save()
else:
form = MyForm()
return render(request, 'my_template.html', {'form': form})
<form method='POST' enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" />
</form>
Комментарии:
1. Я хочу, чтобы пользователь мог вводить не более 5 изображений для каждого тура, я использовал javascript в своем шаблоне, когда пользователь выбирает изображение, он автоматически добавляет другой входной файл, в то время как он вводит не более 5 изображений, как я могу реализовать это, пока я использую ModelForms?
2. Ваша модель поддерживает только одно изображение за тур. Если бы у вас была другая модель, которая была (многие к одному) связана с Tour, вы бы использовали
FormSet
другой мощный инструмент form . docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets3. извините, я новичок в django, и у меня странный вопрос! где я должен определить свои формы модели? Я поместил его в модели. py, но у него ошибка! в документации я не нашел, где определить ModelForms
4. ModelForms? Это, скорее всего, будет определено в вашем
views.py
для простого приложения. По мере увеличения приложения оно может быть определено вforms.py