Получение ошибки типа при передаче модели в теге select в Django
У меня есть модель Department, в ней есть данные College и HS, когда я пытаюсь сохранить форму, я всегда получаю TypeError. Я попытался проверить форму и обнаружил, что это форма unbound, поэтому я попытался изменить тип поля department с ChoiceField на CharField и в моих шаблонах я попытался вызвать {{form.department}} и это дает мне правильные данные, но все равно выдает TypeError.
views.py
class editProfile(UpdateView):
model = Profile
form_class = UpdateUserForm
template_name = 'accounts/profile.html'
success_url = reverse_lazy('homepage')
#TypeError or ValueError
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['initial']=Profile.objects.get(user=self.request.user)
context['department']=Department.objects.all()
context['program']=Program.objects.all()
context['year']=Year.objects.all()
return context
def form_valid(self, form):
user = form.save(commit=False)
user.username = form.cleaned_data.get('username')
user.profile.department = form.cleaned_data.get('department')
user.profile.program = form.cleaned_data.get('program')
user.profile.year = form.cleaned_data.get('year')
user.profile.save()
user.save()
forms.py
class UpdateUserForm(forms.ModelForm):
def __init__(self, *args, **kwargs) -> None:
super(UpdateUserForm, self).__init__(*args, **kwargs)
self.fields['username'].label = 'Username'
self.fields['department'].label = 'Department'
self.fields['program'].label = 'Program'
self.fields['year'].label = 'Year'
username = forms.CharField(widget=forms.TextInput(attrs={
'class': 'form-control',
'placeholder': 'Type your username'
}))
department = forms.CharField(widget=Select(attrs={
'class': 'form-control'
}))
program = forms.CharField(widget=Select(attrs={
'class': 'form-control',
},
))
year = forms.CharField(widget=Select(attrs={
'class': 'form-control',
},
))
class Meta:
model = User
fields = ['department', 'program', 'year', 'username']
models.py
class Department(models.Model):
department=[
('HS','Highschool Department'),
('College','College Department')
]
name = models.CharField(_('Department'),max_length=50,choices=department)
def __str__(self):
return self.name
class Program(models.Model):
programs = [
('Junior', 'Junior Highschool'),
('Senior', 'Senior Highschool'),
('IT', 'Information Technology'),
('P', 'Psychology'),
('SW', 'Social Work'),
('MT', 'Medical Technology'),
]
name = models.CharField(_('Program'),max_length=50,choices=programs)
department = models.ForeignKey(Department,on_delete=models.CASCADE)
def __str__(self):
return self.name
class Year(models.Model):
year=[
('7','Grade 7'),
('8','Grade 8'),
('9','Grade 9'),
('10','Grade 10'),
('11','Grade 11'),
('12','Grade 12'),
('1st','1st Year'),
('2nd','2nd Year'),
('3rd','3rd Year'),
('4th','4th Year'),
('5th','5th Year'),
]
name = models.CharField(_('Year'),max_length=10,choices=year)
def __str__(self):
return self.name
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
department = models.ForeignKey(Department,on_delete=models.SET_NULL,null=True)
program= models.ForeignKey(Program,on_delete=models.SET_NULL,null=True)
year= models.ForeignKey(Year,on_delete=models.SET_NULL,null=True)
def __str__(self):
return self.user.username
accounts/profile.html
<form method="post">
{% csrf_token %}
<h3>Profile Details</h3>
<input type="text" name="username" value="{{user.username}}"
placeholder="Type your username"
id="id_username" readonly>
<select name="department" id="id_department">
<option value="">---------------------</option>
{% for dept in department %}
<option {% if initial.department == dept %} selected {% endif %}
value="{{dept}}"> {{dept}}
</option>
{% endfor %}
</select>
<select name="program" class="form-select" id="id_program">
<option value="">---------------------</option>
{% for prog in program %}
<option {% if initial.program == prog %} selected {% endif %}
value="{{prog}}">
{{prog}}
</option>
{% endfor %}
</select>
<select name="year" class="form-select" id="id_year">
<option value="">---------------------</option>
{% for yr in year%}
<option {% if initial.year == yr %} selected {% endif %}
value="{{yr}}">
{{yr}}
</option>
{% endfor %}
</select>
<button type="submit">Update Profile</button>
</form>