Ошибка при отправке формы в Django
Я работал над проектом и застрял очень плохо. Я пытался создать функциональность "Редактировать профиль" и создал для нее форму (с помощью представлений, основанных на функциях, я чувствую себя гибко с ними работать). Я храню пользователей в таблице "Пользователь", которая находится в django.contrib.auth.models, но хотел хранить дополнительную информацию, такую как номер телефона, идентификатор Facebook, идентификатор Twitter и т. д., в другой таблице, в которой я создал поле OneToOne между пользователем и его информацией. Теперь во время отправки формы редактирования профиля поле OneToOne вызывает у меня некоторые проблемы. Я делюсь всем кодом:
models.py
from django.db import models
from django.contrib.auth.models import User
from django.core.validators import RegexValidator
# Create your models here.
class UserInfo(models.Model):
userinfo = models.OneToOneField(User, on_delete=models.CASCADE,
related_name='info')
username = models.CharField(max_length=100, blank=True)
profilepic = models.ImageField(blank=True)
description = models.CharField(max_length=2000, blank=True)
phoneregex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
phonenumber = models.CharField(validators=[phoneregex],
max_length=13, blank=True)
facebook = models.URLField(max_length=200, blank=True)
twitter = models.URLField(max_length=200, blank=True)
github = models.URLField(max_length=200, blank=True)
linkedin = models.URLField(max_length=200, blank=True)
address = models.CharField(max_length=1000, blank=True)
datejoined = models.DateField(auto_now=True)
Skills = models.CharField(max_length=200, blank=True)
def __str__(self):
return self.username
views.py
def EditProfileView(request, uid):
form = EditProfileForm()
user = User.objects.get(id=uid)
userinfos = UserInfo()
if request.method == 'POST':
form = EditProfileForm(request.POST)
if form.is_valid():
print("form is valid")
userinfos = form.save()
userinfos.username = request.POST.get('username')
userinfos.profilepic = request.POST.get('profilepic')
userinfos.description = request.POST.get('description')
userinfos.phonenumber = request.POST.get('phonenumber')
userinfos.facebook = request.POST.get('facebook')
userinfos.twitter = request.POST.get('twitter')
userinfos.linkedin = request.POST.get('linkedin')
userinfos.github = request.POST.get('github')
userinfos.address = request.POST.get('address')
userinfos.skills = request.POST.get('skills')
userinfos.save()
return redirect(reverse('accounts:profile', args=(uid,)))
else:
print(form.errors)
print("Form is not valid")
return HttpResponse("Form is not valid")
else:
print("Didn't requested Post")
return render(request, 'edit_profile.html', {'form': form, 'user':
user})
return render(request, 'edit_profile.html', {'form':form, 'user':
user})
forms.py
class EditProfileForm(ModelForm):
username = forms.CharField(required=False,
widget=forms.TextInput(attrs={'class' : 'textfield form-control'}))
# profilepic = forms.ImageField(widget=forms.FileInput(attrs={'class'
: 'form-control'}))
phonenumber = forms.CharField(widget=forms.TextInput(attrs={'class' :
'textfield form-control'}))
facebook = forms.URLField(widget=forms.URLInput(attrs={'class' :
'textfield form-control'}))
twitter = forms.URLField(widget=forms.URLInput(attrs={'class' :
'textfield form-control'}))
linkedin = forms.URLField(widget=forms.URLInput(attrs={'class' :
'textfield form-control'}))
github = forms.CharField(widget=forms.TextInput(attrs={'class' :
'textfield form-control'}))
class Meta:
model = UserInfo
fields = '__all__'
edit_profile.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style type="text/css">
body {
background: lightgray;
}
.main-container{
padding: 20px;
}
.heading {
font-size: 58px;
}
.form-container {
padding-top: 5%;
background: white;
}
.textfield {
width: 100%;
border: 3px solid lightgray;
border-radius: 8px;
}
.textfield-row {
padding-bottom: 40px;
align-items: center;
align-content: center;
}
.submit-button {
width: 100%;
border-radius: 5px;
}
</style>
</head>
<body>
<div class="container-fluid main-container jumbotron">
<center><h1 class="heading"><b>Edit Profile</b></h1></center>
</div>
<form action="{% url 'accounts:edit' user.id %}" class="form-
horizontal" method='POST'>
{% csrf_token %}
<div class="container text-center form-container">
<div class="row textfield-row">
<div class="col-sm-3">
<label for="Username"><b>Username :</b></label>
</div>
<div class="col-sm-9">
{{ form.username }}
</div>
</div>
{% comment %}
<div class="row textfield-row">
<div class="col-sm-3">
<label for="Username"><b>Profile Image :</b></label>
</div>
<div class="col-sm-9">
{{ form.profilepic }}
</div>
</div>{% endcomment %}
<div class="row textfield-row">
<div class="col-sm-3">
<label for="Username"><b>Phone :</b></label>
</div>
<div class="col-sm-9">
{{ form.phonenumber }}
</div>
</div>
<div class="row textfield-row">
<div class="col-sm-3">
<label for="Username"><b>Facebook id :</b></label>
</div>
<div class="col-sm-9">
{{ form.facebook }}
</div>
</div>
<div class="row textfield-row">
<div class="col-sm-3">
<label for="Username"><b>Twitter id :</b></label>
</div>
<div class="col-sm-9">
{{ form.twitter }}
</div>
</div>
<div class="row textfield-row">
<div class="col-sm-3">
<label for="Username"><b>Linkedin id :</b></label>
</div>
<div class="col-sm-9">
{{ form.linkedin }}
</div>
</div>
<div class="row textfield-row">
<div class="col-sm-3">
<label for="Username"><b>Github :</b></label>
</div>
<div class="col-sm-9">
{{ form.github }}
</div>
</div>
<div class="row textfield-row">
<div class="col-sm-12">
<input type="submit" class="btn btn-success
submit-button" value="Save Profile" name="Save Profile"/>
</div>
</div>
</div>
</form>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js"></script>
</body>
</html>
Теперь код ошибки:
System check identified no issues (0 silenced).
April 10, 2018 - 04:30:30
Django version 2.0.3, using settings 'Dumbster.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Didn't requested Post
[10/Apr/2018 04:30:33] "GET /dumbster/edit_profile/3 HTTP/1.1" 200
4332
<ul class="errorlist"><li>userinfo<ul class="errorlist"><li>This field
is required.</li></ul></li></ul>
Form is not valid
[10/Apr/2018 04:30:45] "POST /dumbster/edit_profile/3 HTTP/1.1" 200 17
Теперь здесь говорится, что поле userinfo является обязательным, которое является полем OneToOne, и, конечно, оно обязательно, но как мне его предоставить и откуда?
Пожалуйста, не беспокойтесь об отступах, все в порядке в моем коде, и, если хотите, я могу предоставить больше информации. Я знаю, что это не эффективный код, но, будучи новичком в Django и Back-end Development, это начинается для меня, и эта ошибка пожирает все мое время.
Надеюсь, что кто-нибудь сможет понять мой код на этом этапе и помочь мне решить его:(