Как сохранить данные в базе данных из выпадающего списка в Djngo
Вот мой код
Я работаю над проектом управления студентами и не могу получить филиал для студента, так как он является foreignkey модели курса к модели студента, и я хочу получить выбранный вариант в модели студента в строке филиала
models.py
class Course(models.Model):
id=models.AutoField(primary_key=True)
course = models.CharField(max_length=50)
course_code = models.BigIntegerField(null=True)
def __str__(self):
return self.course
class Student(models.Model):
id=models.AutoField(primary_key=True)
user=models.OneToOneField(User,on_delete=models.CASCADE)
branch=models.ForeignKey(Course,on_delete=models.CASCADE,null=True,blank=True)
middle_name=models.CharField(max_length=50,null=True)
roll_no=models.IntegerField()
mobile_no=PhoneNumberField(default='')
parents_mobile_no=PhoneNumberField(default='')
division=models.CharField(max_length=10,null=True)
batch=models.CharField(max_length=10,null=True)
def __str__(self):
return self.user.first_name + " " + self.user.last_name
views.py
def studentregister(request):
if request.method == 'POST':
first_name = request.POST['first_name']
middle_name = request.POST['middle_name']
last_name = request.POST['last_name']
email = request.POST['email']
branch= request.POST['branch']
division = request.POST['division']
roll_no = request.POST['roll_no']
mobile_no = request.POST['mobile_no']
parents_mobile_no = request.POST['parents_mobile_no']
pass1 = request.POST['password']
pass2 = request.POST['confirmpassword']
if pass1 == pass2 :
if User.objects.filter(email=email).exists():
return HttpResponse('User already exsits')
else:
user = User.objects.create_user(email=email, password=pass1, first_name=first_name, last_name=last_name)
user.save();
studentdetails = Student ( user=user, middle_name=middle_name,roll_no=roll_no,mobile_no=mobile_no,parents_mobile_no=parents_mobile_no, branch=branch,division=division)
studentdetails.save();
return render (request, 'ms/homepage/index.html')
else:
return HttpResponse('password does not match')
else:
return HttpResponse('failed')
def staffstudent(request):
if request.user.is_authenticated and request.user.user_type==3:
courses = Course.objects.all()
return render(request, 'ms/staff/student.html',{'courses':courses})
else:
return render(request,'ms/login/login.html')
html файл как student.py
<form action="studentregister" method="POST" style = "background-color:#011B3C;">
{% csrf_token %}
<div class="form-group" name="branch">
<select >
<option selected disabled="true">Branch</option>
{% for course in courses%}
<option>{{course.course}}</option>
{%endfor%}
</select>
</div>
</form>
Ошибка, которую я получаю, заключается в следующем MultiValueDictKeyError at /staff/studentregister 'branch'
Пожалуйста, помогите мне с этим как можно скорее
Вы не назвали этот <select>
(<select name="branch">
), поэтому любой выбор, который вы сделаете в нем, не будет передан на сервер, и поэтому вы получаете ошибку ключа.
Кроме того, значение <option>
должно быть идентификатором курса:
<option value="{{ course.id }}">{{ course.course }}</option>
... чтобы вы могли посмотреть его в представлении:
branch = Course.objects.get(id=request.POST['branch'])
Однако, пожалуйста посмотрите на встроенную функциональность форм в Django, особенно формы моделей - вы сделаете это за долю кода HTML и Python, который у вас есть сейчас, плюс у вас будет правильная валидация данных.
Это не совсем обычный способ работы с формами в Django, хотя это можно сделать. Традиционным было бы:
создание формы в forms.py выглядит так:
class MyForm(forms.Form):
dropdown_one = forms.ChoiceField(
label="Country",
widget=forms.Select(attrs={"class": "selecter form-control"}),
choices=[],
)
dropdown_two = forms.ChoiceField(
label="Category",
widget=forms.Select(attrs={"class": "selecter form-control"}),
choices=[(None, '...')],
required=True
)
затем используйте эту форму в файле views.py следующим образом:
my_form = MyForm(initial={})
return render(request,{'my_form':my_form})
затем, наконец, в html файле :
{{my_form.media}}
{% for item in my_form %}
<div class="form-group col-lg-2" id="dropdown-content">
{{item.label_tag}}
{{item}}
</div>
{% endfor %}
</div>
Надеюсь, это поможет. За дополнительной информацией обращайтесь сюда: https://docs.djangoproject.com/en/4.0/topics/forms/