Как получить чекбокс Select Multiple для страницы профиля
Новичок в Django.
Цель: Я хотел бы получить множественный выбор избранных категорий с помощью флажка и сохранить их в базе данных.
Проблема Сейчас у меня есть форма профиля и модель, и виджет CheckboxSelectMultiple не работает так, как я хочу. Категории хранятся в другой модели, на которую я ссылаюсь в профиле пользователя.
# # # # user/forms/profile_form.py
class ProfileForm(ModelForm):
class Meta:
model = Profile
exclude = [ 'id', 'user']
widgets = {
'favourite_categories': widgets.CheckboxSelectMultiple(attrs={'class': 'form-control'}),
'profile_picture': widgets.TextInput(attrs={'class': 'form-control'})
}
# # # # user/models.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
first_name = models.CharField(max_length=200, blank=True)
last_name = models.CharField(max_length=200, blank=True)
favorite_categories = models.ManyToManyField(Category, blank=True)
profile_image = models.CharField(max_length=200, null=True, blank=True)
# # # # user/views.py
@ login_required
def profile(request):
user_profile = Profile.objects.filter(user=request.user).first()
if request.method == 'POST':
form = ProfileForm(instance=user_profile, data=request.POST)
if form.is_valid():
user_profile = form.save(commit=False)
user_profile.user = request.user
user_profile.save()
return redirect('profile')
return render(request,
'user/profile.html',
context={"form": ProfileForm(instance=user_profile)})
# # # # templates/user/profile.html
<div class="shadow p-4 mb-5 mx-5 bg-body rounded">
<form class="form form-horizontal" method="post">
{% csrf_token %}
{{ form|crispy }}
<input type="submit" class="btn btn-primary" value="Update" />
</form>
</div>
Выход этого можно увидеть на рисунке.
PS. Я также не знаю, как использовать ImageField для вставки изображения профиля. Я использую облачную базу данных google, и ImageField требует переменную upload_to, которая указывает, куда будет загружено изображение. Я хотел бы хранить изображение в облачной базе данных, как и все остальные данные.
Похоже, вам придется написать свой собственный виджет CheckboxSelectMultiple
. Вы можете посмотреть ответ в этом посте .