Как получить чекбокс 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>

Выход этого можно увидеть на рисунке. Output of the current code.

PS. Я также не знаю, как использовать ImageField для вставки изображения профиля. Я использую облачную базу данных google, и ImageField требует переменную upload_to, которая указывает, куда будет загружено изображение. Я хотел бы хранить изображение в облачной базе данных, как и все остальные данные.

Похоже, вам придется написать свой собственный виджет CheckboxSelectMultiple. Вы можете посмотреть ответ в этом посте .

Вернуться на верх