сохранение поля изображения из шаблона django в таблицу

#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/#formsets

3. извините, я новичок в django, и у меня странный вопрос! где я должен определить свои формы модели? Я поместил его в модели. py, но у него ошибка! в документации я не нашел, где определить ModelForms

4. ModelForms? Это, скорее всего, будет определено в вашем views.py для простого приложения. По мере увеличения приложения оно может быть определено в forms.py