Пытаюсь отредактировать профиль с помощью Django, но постоянно сталкиваюсь с ошибками

Мне очень сложно разрешить пользователям обновлять модель профиля в моем приложении.

Я работаю над созданием веб-приложения, которое помогает людям установить диету. Общая структура такова: посетитель сайта появляется на сайте и сразу попадает на страницу Sign In и либо регистрируется, либо входит в систему. Когда они регистрируются, автоматически создается профиль. Мысль заключалась в том, что данные пользователя (рост, вес и т.д.) будут добавлены в модель профиля.

Сейчас новый пользователь заходит в раздел Sign in -> Register -> Sign In -> Profile (который заполнен пустыми данными) -> и Edit Profile. Именно на редактировании профиля я и застрял. Неважно, что я пытаюсь сделать, я продолжаю сталкиваться с ошибками и слишком много кручу колеса. Буду очень признателен за помощь.

Модели

from django.db import models
from django.contrib.auth.models import User
from django.dispatch import receiver #add this
from django.db.models.signals import post_save #add this


SEX = [('Male', 'Male'), ('Female', 'Female')]
ActivityLevels = [('Sedentary', 'Sedentary'), ('Lightly active', 'Lightly active'), ('Moderately active', 'Moderately active'),('Active', 'Active'), ('Very active', 'Very active')]

# Create your models here.
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
    massLbs = models.IntegerField("Weight in Lbs", null=True, blank=True)
    heightFeet = models.IntegerField("Feet", null=True, blank=True)
    heightInches = models.IntegerField("Inches", null=True, blank=True)
    age = models.IntegerField("Age", null=True, blank=True)
    sex = models.CharField(max_length = 6, choices = SEX, default = "Male", null=True, blank=True)
    activity = models.CharField(max_length = 50, choices = ActivityLevels, default = 'Lightly active', null=True, blank=True)
    
    def __str__(self):
        return self.user.username

@receiver(post_save, sender=User) #add this
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User) #add this
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

## https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#onetoone

class Macro(models.Model):
    userid = models.OneToOneField(Profile, on_delete=models.CASCADE, null=True, blank=True)
    BMR = models.IntegerField()

    def __str__(self):
        return self.userid + "_Macro"

Виды

Forms

from django.forms import ModelForm
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import Profile

class CreateUserForm(UserCreationForm):
    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

class ProfileForm(ModelForm):
    class Meta:
        model = Profile
        fields = ('massLbs', 'heightFeet', 'heightInches', 'age', 'sex', 'activity')

Urls

from django.urls import path
from . import views

urlpatterns = [
    path('results/', views.results, name="results"),
    path('mealplan/', views.mealplan, name='mealplan'),
    path('register/', views.registerPage, name='register'),
    path('', views.loginPage, name='login'),
    path('logout/', views.logoutUser, name="logout"),
    path('editprofile/<int:pk>/', views.editProfile, name="editprofile"),
    path('profile/', views.profile, name="profile"),
]

Профиль

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Profile</title>
</head>
<body>
    <h3>Profile Summary</h3>
    <p>{{user_profile.user.username}}</p>
    <p>{{user_profile.massLbs}}</p>
    <p>{{user_profile.heightFeet}}</p>
    <p>{{user_profile.heightInches}}</p>
    <p>{{user_profile.age}}</p>
    <p>{{user_profile.sex}}</p>
    <p>{{user_profile.activity}}</p>
    <div>
        <a href="{% url 'editprofile' user_profile.id %}">Edit Profile</a>
    </div>
</body>
</html>

Редактировать профиль

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Edit Profile</title>
</head>
<body>
    <h3>Edit Profile</h3>
    <div>
        <p>
            <span>Hello, {{request.user}}!    </span>
            <span><a href="{%url 'logout' %}">Logout</a></span>
        </p>
    </div>
    <div>
        <form action={% url 'results'} method="post" enctype="multipart/form-data">
            {% csrf_token %}
            {{form.as_p}}
            <input type="submit" value="Update">
        </form>
    </div>
</body>
</html>
Вернуться на верх