Django выбирает несколько объектов и сохраняет выбор пользователя - PullRequest
0 голосов
/ 29 июня 2018

Мне нужна помощь в получении пользовательских настроек для сохранения в БД. У меня есть набор объектов сообщества, определенных следующей моделью:

class Community(models.Model):
    name = models.CharField(max_length=20, unique=True)
    banner = models.ImageField(upload_to="communityBanners", blank=True)
    creation_date = models.DateTimeField(default=timezone.now)

У каждого пользователя есть профиль, который выглядит следующим образом:

class UserProfile(models.Model):
    user = AutoOneToOneField(settings.AUTH_USER_MODEL, primary_key=True,
                             on_delete=models.CASCADE)
    points = models.DecimalField(default=0.0, max_digits=10, decimal_places=2)
    credScore = models.DecimalField( default=0.0, max_digits=4, decimal_places=2 )
    website = models.URLField(blank=True)
    avatar = models.ImageField(upload_to="profilePics", blank=True)

    community_preferences = models.ManyToManyField(Community)

Я сделал так, чтобы пользователи могли создавать новые сообщества. Однако я также хочу сделать так, чтобы другие пользователи могли перейти к форме множественного выбора и выбрать, в какие сообщества они хотят вступить, затем нажать «Отправить» и сохранить настройки. Поскольку сообщества являются объектами, как мне создать поле объекта с множественным выбором и форму, чтобы они могли выбирать их, а затем сохранять свои предпочтения?

Может ли кто-нибудь помочь мне показать, как структурировать следующее: форму, HTML-шаблон для отображения параметров и как правильно сохранить настройки?

У меня сложилось впечатление, что ModelChoiceField здесь не будет работать, поскольку я хочу иметь возможность выбрать один, все или любое число между объектами.

EDIT:

Вот новая форма:

class CommunitySelectForm(forms.Form):
    communities = forms.ModelMultipleChoiceField(queryset=Community.objects.all(), widget=forms.CheckboxSelectMultiple)

Вот мой взгляд:

def joinCommunities(request, user_id):
    #user_ob = get_user_model().objects.filter(id=user_id).first()
    #full_user_profile = UserProfile.objects.filter(user=user_ob).first()

    if request.method == 'POST':
        form = CommunitySelectForm(request.POST)
        if form.is_valid():
            comms = form.save(commit=False)
            comms.user = request.user
            comms.save()
    else:
        form = CommunitySelectForm()
    print(form)
    return render(request, 'qa/select_communities.html', {'form' : form})

А вот шаблон, который, похоже, ничего не загружает:

{% extends 'qa/base.html' %}
{% load staticfiles %}
{% load gravatar %}
{% block content %}

<div>
    <div class="col-sm-8 input">
      <form method="post" enctype='multipart/form-data'>
          {% csrf_token %}    
            {% for field in form %}
                <div class="form-group">
                    <div class="col-sm-offset-2 col-sm-10">


                        <span class="text-danger small">{{ field.errors }}</span>
                    </div>
                    <label class = "control-label col-sm-2">{{ field.label_tag }}</label>
                    <div class="col-sm-10">{{ field }}</div>
                </div>
            {% endfor %}
          <input class="btn btn-submit pull-right" href="/profile/{{ user.id }}" type="submit" value="Choose Communities" />
      </form>
    </div>
</div>

{% endblock content %}

Я также настроил URL для присоединения к сообществам следующим образом:

 url(r'^join-communities/(?P<user_id>\d+)/$', views.joinCommunities, name='qa_join_communities')

Проблема в том, что при отправке формы она не сохраняется, и я получаю эту ошибку:

'CommunitySelectForm' object has no attribute 'save'

1 Ответ

0 голосов
/ 29 июня 2018

Вы можете создать форму следующим образом:

from django import forms


class CommunitiesSelectForm(forms.Form):
    communities = forms.ModelMultipleChoiceField(queryset=Community.objects.all(),widget=forms.CheckboxSelectMultiple)

Это создаст форму с флажком для сообществ. Тогда в ваших взглядах внутри метода сообщения

получить текущего пользователя и получить сообщества из отправленной формы и связать их.

{% extends 'qa/base.html' %}
{% load staticfiles %}
{% load gravatar %}
{% block content %}

<div>
    <div class="col-sm-8 input">
      <form method="post" enctype='multipart/form-data'>
          {% csrf_token %}    
          {{ form }}  
          <input class="btn btn-submit pull-right" href="/profile/{{ user.id }}" type="submit" value="Choose Communities" />
      </form>
    </div>
</div>

Установите свой шаблон так.
{% endblock content%}

...