Django Files не сохраняет

Я хочу сделать проект django, в котором вы загружаете изображение и это изображение отображается на другой странице. Я могу редактировать его только с помощью панели администратора.

Вот код:

Views.py

def home(request):
    all1 = New.objects.filter(username='mynameis12').all()
    if not request.user.is_authenticated:
        return redirect('/login/')
    return render(request, 'home.html',{'alls':all1})

Models.py

class New(models.Model):
    username = models.CharField(max_length=200)
    image = models.ImageField(upload_to='media')

Forms.py


class New1(ModelForm):
    username = forms.CharField(max_length=200)
    image = forms.ImageField(required=False)
    class Meta:
        model = New
        fields = ['username','image']

Settings.py

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
CRISPY_TEMPLATE_PACK = 'bootstrap4'
LOGIN_URL = '/b/'
LOGIN_REDIRECT_URL = '/b/'
LOGOUT_REDIRECT_URL = '/'

MEDIA_URL = '/media/'
MEDIA_ROOT =  os.path.join(BASE_DIR, 'media') 
STATICFILES_DIRS = (
    os.path.join(BASE_DIR,'static'),
)

Изображение отображается, но не сохраняется.

Что мне делать?

Спасибо.

Вам нужно импортировать вашу форму в представления и сохранить форму внутри вашего представления:

from forms import New1

def home(request):
    if not request.user.is_authenticated:
        return redirect('/login/')
    all1 = New.objects.filter(username='mynameis12').all()
    form = New1()
    if request.method == "POST":
        form = New1(request.POST)
        form.save()
    return render(request, 'home.html',{'alls':all1,'form':form})

в вашем HTML:

<form>
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save</button>
</form>

Перейдите по этой ссылке для получения учебника: https://tutorial.djangogirls.org/en/django_forms/

Если вы хотите загрузить фотографии на главную страницу, вы должны передать в нее форму

views.py

from django.contrib.auth.decorators import login_required

# if you just want to display the images in the home page
from .models import New
@login_required(login_url="login") # this does the same thing as the if statement but better
def home(request):
    all1 = New.objects.filter(username='mynameis12')# no need for the '.all()'
    return render(request, "home.html", {"all1": all1 })

Если вы редактируете только панель администратора, то нет необходимости использовать форму, но если вы все еще хотите, то вот она.

views.py

from django.contrib.auth.decorators import login_required
from .forms import NewForm
@login_required(login_url="login") # this does the same thing as the if statement but better
def home(request):
    form = NewForm()
    if request.method == "POST":
        form = NewForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            ...
    return render(request, "home.html", {"form": form})

forms.py

class NewForm(ModelForm):
    class Meta:
        model = New
        fields = ['username','image']

    def __init__(self, *args, **kwargs):
        super(NewForm, self).__init__(*args, **kwargs)
        for name, field in self.fields.items():
            field.widget.attrs.update({'class': "input"})

здесь нет необходимости переопределять поля, если вы ничего не меняете в определении модели в файле models.py.

Вернуться на верх