Загрузка изображения через форму загрузки в профиль пользователя Django - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь создать страницу регистрации учащегося, которая позволяет ученику загрузить фотографию профиля.Я использую модель Django User и модель StudentProfile, которая имеет отношение OneToOne с User.Вот мои коды:

student \ models.py:

from django.db import models
from django.contrib.auth.models import User


class StudentProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,)
    avatar = models.ImageField(upload_to='student_profile/', null=True, blank=True)

    def __str__(self):
        return self.user.username

Students / form.py:

from django import forms


class ImageUploadForm(forms.Form):
    profile_photo = forms.ImageField()

eLearning / views.py:

from django.contrib.auth import authenticate, login, get_user_model
from django.http import HttpResponse
from django.shortcuts import render, redirect

from .forms import LoginForm, RegisterForm
from students.forms import ImageUploadForm
from students.models import StudentProfile

User = get_user_model()


def register_page(request):
    register_form = RegisterForm(request.POST or None)
    photo_upload_form = ImageUploadForm(request.POST, request.FILES)

    context = {
        "register_form": register_form,
        "photo_upload form": photo_upload_form
    }
    if register_form.is_valid():
        # print(register_form.cleaned_data)
        username = register_form.cleaned_data.get("username")
        first_name = register_form.cleaned_data.get("first_name")
        last_name = register_form.cleaned_data.get("last_name")
        email = register_form.cleaned_data.get("email")
        password = register_form.cleaned_data.get("password")

        new_user = User.objects.create_user(
            username, email, password,
            first_name=first_name,
            last_name=last_name,
        )

        if photo_upload_form.is_valid():
            user = username
            avatar = photo_upload_form.cleaned_data.get("profile_photo")
            new_user_profile = StudentProfile.objects.create(user, avatar)

        print(new_user)
    return render(request, "auth/register.html", context)

auth / register.html:

{% extends "base.html" %}
{% load static %}

{% block content %}

{% load crispy_forms_tags %}

<div class="container">
    <div class="row my-4">
        <div class="col-5">
            <form action="" method="post" class="form-control">
                {% csrf_token %}
                {{ register_form|crispy }}
            <input type="submit" class="btn btn-default" value="Submit">
            </form>
        </div>
        <div class="col-5">
            <form method="post" enctype="multipart/form-data" class="form-control">
                {% csrf_token %}
                 <input id="id_image" type="file" class="my-2" name="image">
                {{ photo_upload_form|crispy }}
            </form>
        </div>
    </div>
</div>
{% endblock %}

У меня 2 проблемы:

1) ImageUploadForm не отображается на register.html

2) StudentProfile не создается.User создается нормально.

Я также пытался заменить форму на ModelForm для ImageUploadForm, но я получаю NULL constraint для student_user, так как Django не знает, что такое user для StudentProfile.

Я просматривал переполнение стека.Все решения о том, как загрузить изображение пользователя администратору Django, но я не нашел ничего, что показывало бы, как связать загруженное изображение с моделью пользователя во время регистрации.Простите, если это повторный вопрос.Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Так что я понял это.Настоящая проблема была с кодом register.html.Кнопка отправки работала только для register_form, поэтому форма для загрузки фотографий не проверялась, поэтому запись профиля ученика не создавалась.Вот обновленный код:

eLearning / views.py:

from students.forms import ImageUploadForm
from students.views import upload_pic

     def register_page(request):
            register_form = RegisterForm(request.POST or None)
            photo_upload_form = ImageUploadForm(request.POST, request.FILES)

            context = {
                "register_form": register_form,
                "photo_upload_form": photo_upload_form
            }
            if register_form.is_valid():
                username = register_form.cleaned_data.get("username")
                first_name = register_form.cleaned_data.get("first_name")
                last_name = register_form.cleaned_data.get("last_name")
                email = register_form.cleaned_data.get("email")
                password = register_form.cleaned_data.get("password")

                new_user = User.objects.create_user(
                    username, email, password,
                    first_name=first_name,
                    last_name=last_name,
                )


                upload_pic(request, photo_upload_form, username=username)

            return render(request, "auth/register.html", context)

Students / Views.py:

from django.contrib.auth import get_user_model
from django.http import HttpResponseRedirect
from django.shortcuts import render, redirect, HttpResponse

from .models import StudentProfile
from .forms import ImageUploadForm

def upload_pic(request, form, username):
        if request.method == 'POST':
            if form.is_valid():
                User = get_user_model()
                user = User.objects.get(username=username)
                avatar = form.cleaned_data.get('profile_photo')
                new_user_profile = StudentProfile.objects.create(user=user, avatar=avatar)
                new_user_profile.save()

register.html:

{% extends "base.html" %}
{% load static %}

{% block content %}

{% load crispy_forms_tags %}

<div class="container">
    <div class="row my-4">
        <div class="col-5">
            <form action="" method="post" enctype="multipart/form-data" class="form-control">
                {% csrf_token %}
                {{ register_form|crispy }}
                {{ photo_upload_form|crispy }}
                <input type="submit" class="btn btn-default" value="Submit">
            </form>
        </div>
    </div>      
</div>

{% endblock %}

Вы должны убедиться, что enctype="multipart/form-data" находится внутри ваших тегов, иначе форма загрузки изображения не будет проверена.Я также рекомендовал бы добавить метод проверки изображения в ваш form.py.Что-то, на что Сачин указал ранее: Форма изображения и проверка .Надеюсь это поможет.

0 голосов
/ 29 января 2019

В вашем eLearning/views.py: контексте, который вы передаете на html-страницу, отсутствует _

 context = {
        "register_form": register_form,
        "photo_upload form": photo_upload_form
    }

Это будет причиной того, что ImageUploadForm не отображает на register.html

Это должно быть как

context = {
        "register_form": register_form,
        "photo_upload_form": photo_upload_form
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...