Не удается обновить БД с помощью формы HTML в Django - PullRequest
0 голосов
/ 27 марта 2020

Мне нужно заполнить имя поля и изображение для загрузки в БД Django, но я не могу его обновить, используя метку формы HTML

views.py

"""Artist views."""
# Django
from django.shortcuts import render, redirect
from django.views import View
from django.http import HttpResponse

# Models
from music.models import Artist

# Forms
from artist.forms import ArtistForm

class AddArtistView(View):
 """Adding new artist."""

 def upload_image(request):
     if request.method == 'POST':
         form = ImageUploadForm(request.POST, request.FILES)
         if form.is_valid():
             m = Artist.objects.get(pk=image_id)
             m.model_pic = form.cleaned_data['image']
             m.save()
             return HttpResponse('Image upload success')
     return HttpResponseForbidden('Allowed only via POST')

 template = "artist/create_artist.html"  

 def get(self, request):
    """Render add artist form."""
    form = ArtistForm()
    context = {"form": form}
    return render(request, self.template, context)


 def post(self, request):
    """Receive and validate add artist form."""
    form = ArtistForm(request.POST)

    if not form.is_valid():
       context = {"form": form}
       print(form.errors)
       return render(request, self.template, context)

    new_artist = Artist.objects.create_artist(
        name=form.cleaned_data["name"],
    )
    return HttpResponse("<h1>Artist Added!</h1>")

models.py

"""Music Models"""
from django.db import models


class Artist(models.Model):
    """Artist Model."""

    name = models.CharField(max_length=200)
    image = models.ImageField(null=True, upload_to='artists/images/')

    def __str__(self):
        """Get str representation."""
        return self.name

    def __repr__(self):
        """Get str representation."""
        return self.__str__()

forms.py

"""Artist forms."""
# Django
from django import forms
#from django.contrib.auth.models import Artist

from music.models import Artist

class ArtistForm(forms.Form):
    """Add new artist"""

    name = forms.CharField(max_length=200)
    image = forms.ImageField()

    def clean_name(self):
        """Validate that the artist name doesn't exist in the database."""
        data = self.cleaned_data["name"]
        if Artist.objects.filter(name=data).count() > 0:
            raise forms.ValidationError("This artist already exists.")

        return data

И, наконец, HTML

{% extends 'music/base.html' %}

{% block title %}Add Artist{% endblock title %}
{% block body_content %}
<h1>Add New Artist</h1>
<form action= "{% url upload_image %}" method="POST" enctype="multipart/form-data">
    {% csrf_token %}

    {% for field in form %}
    <div>
        {{ field.errors }}
        {{ field.label_tag }}
        {{ field }}
    </div>
    {% endfor %}
    <input value="Add" type="submit">
</form>
{% endblock body_content %}

Несколько раз я получал ошибку 405 и 404 или перенаправление на одну и ту же страницу, поле имени исполнителя остается, но загруженное мной изображение исчезает с сообщением:

См. изображение

enter image description here

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Я решил это так, у вас проблема с методом

create_user

вам нужно сделать это

Artist.objects.create(
    name=form.cleaned_data["name"],
    image=form.cleaned_data["image"],
)

и добавить

ArtistForm(request.POST, request.FILES)

Надеюсь, я помог

0 голосов
/ 27 марта 2020

Вам также необходимо указать request.FILES в форме. Вот документация для получения дополнительной информации о формах .

form = ArtistForm(request.POST, request.FILES)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...