我想使用
User.objects.create_user
和表单
Utilisateurs
的字段来创建用户。图像和用户名字段也用于填充模型
UserProfile
.
views.py:
def sign_in(request):
form=Utilisateur(request.GET)
if request.method=="POST":
form=Utilisateur(request.POST)
if form.is_valid():
User.objects.create_user(username=form.cleaned_data["username"],
password=form.cleaned_data["password"],
first_name=form.cleaned_data["first_name"],
last_name=form.cleaned_data["last_name"],
email=form.cleaned_data["email"]
)
UserProfile.objects.create(username=form.cleaned_data["username"],profile_img=form.cleaned_data["profile_img"])
return redirect("home")
else:
print(form.errors.as_data())
context={"form":form}
return render(request,'signin.html',context)
models.py:
class UserProfile(models.Model):
username=models.CharField(max_length=50)
profile_img=models.ImageField(default="images/logo.png", upload_to="images/",blank=True, null=True)
date = models.DateField(default=django.utils.timezone.now())
forms.py:
class Utilisateur(forms.Form):
first_name=forms.CharField(min_length=4,max_length=15,label="Nom",widget=(forms.TextInput(attrs={"class":"userclass"})))
last_name = forms.CharField(min_length=4, max_length=15,label="Prenom",widget=(forms.TextInput(attrs={"class":"userclass"})))
username=forms.CharField(min_length=4, max_length=15,label="Nom d'uttilisateur",widget=(forms.TextInput(attrs={"class":"userclass"})))
email=forms.EmailField(label="Email",widget=(forms.EmailInput(attrs={"class":"userclass"})))
password=forms.CharField(label="Mot de passe",widget=(forms.PasswordInput(attrs={"class":"userclass"})))
profile_img = forms.ImageField(label="Image de Profile")
class ProfileForm(forms.Form):
profile_img = forms.ImageField(label="Image de Profile", required=False)
错误:
{'profile_img': [ValidationError (['此字段为必填项。'])]}
sign-in.html:
{% load static %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title> Log_in</title>
<link rel="stylesheet" href="{% static 'styles.css' %}" >
</head>
<body>
<br><br>
<h2 style="background-color: black; color: beige; padding: 5px; width:fit-content;">INSCRIVEZ-VOUS</h2>
<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Log-in">
</form>
</body>
</html>
你的问题在于你对
profile_img
字段的处理方式。你在
UserProfile
模型和
Utilisateur
表单中都定义了
profile_img
字段,并且在表单中它是必需的。当提交表单时,它会验证
profile_img
字段是否已填充,即使你没有在
User.objects.create_user
中使用它。
以下是如何解决这个问题的方法:
1. 从
Utilisateur
表单中移除
profile_img
字段:
由于你只在创建
UserProfile
时需要
profile_img
,因此不需要在
Utilisateur
表单中包含它。
修改后的
forms.py
:
class Utilisateur(forms.Form):
first_name=forms.CharField(min_length=4,max_length=15,label="Nom",widget=(forms.TextInput(attrs={"class":"userclass"})))
last_name = forms.CharField(min_length=4, max_length=15,label="Prenom",widget=(forms.TextInput(attrs={"class":"userclass"})))
username=forms.CharField(min_length=4, max_length=15,label="Nom d'uttilisateur",widget=(forms.TextInput(attrs={"class":"userclass"})))
email=forms.EmailField(label="Email",widget=(forms.EmailInput(attrs={"class":"userclass"})))
password=forms.CharField(label="Mot de passe",widget=(forms.PasswordInput(attrs={"class":"userclass"})))
# 删除 profile_img 字段
class ProfileForm(forms.Form):
profile_img = forms.ImageField(label="Image de Profile", required=False)
2. 在视图中处理
profile_img
:
在你的
sign_in
视图中,你可以直接从
request.FILES
中获取上传的图片。
修改后的
views.py
:
def sign_in(request):
if request.method == "POST":
form = Utilisateur(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.cleaned_data["username"],
password=form.cleaned_data["password"],
first_name=form.cleaned_data["first_name"],
last_name=form.cleaned_data["last_name"],
email=form.cleaned_data["email"]
)
# 获取上传的图片
profile_img = request.FILES.get('profile_img')
# 创建 UserProfile,如果提供了图片则使用
UserProfile.objects.create(
username=form.cleaned_data["username"],
profile_img=profile_img
)
return redirect("home")
else:
print(form.errors.as_data())
else:
form = Utilisateur()
context = {"form": form}
return render(request, 'signin.html', context)
3. 更新你的模板以包含
profile_img
字段:
你需要在
signin.html
模板中添加一个文件上传字段,以便用户可以选择图片。
修改后的
signin.html
:
{% load static %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title> Log_in</title>
<link rel="stylesheet" href="{% static 'styles.css' %}" >
</head>
<body>
<br><br>
<h2 style="background-color: black; color: beige; padding: 5px; width:fit-content;">INSCRIVEZ-VOUS</h2>
<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<label for="id_profile_img">Image de Profile:</label>
<input type="file" name="profile_img" accept="image/*" id="id_profile_img"> <br>
<input type="submit" value="Log-in">
</form>
</body>
</html>
通过这些更改,你就可以在创建用户时处理
profile_img
字段,并且不会再遇到
ValidationError
。