Пытаюсь отредактировать профиль с помощью 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>