Django选择多个对象并保存用户选择

Django选择多个对象并保存用户选择,django,object,field,choice,Django,Object,Field,Choice,我需要帮助获取用户首选项以保存到数据库。我有一组由以下模型定义的社区对象: 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=tim

我需要帮助获取用户首选项以保存到数据库。我有一组由以下模型定义的社区对象:

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在这里不起作用,因为我希望能够选择一个、所有或任意数量的对象

编辑:

以下是新表格:

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(r'^join-communities/(?P<user_id>\d+)/$', views.joinCommunities, name='qa_join_communities')
from django import forms


class CommunitiesSelectForm(forms.Form):
    communities = forms.ModelMultipleChoiceField(queryset=Community.objects.all(),widget=forms.CheckboxSelectMultiple)
这将呈现一个带有社区复选框的表单。然后在您的视图中,在post方法中

从提交的表单中获取当前用户和社区,并将其链接

{% 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>
{%extends'qa/base.html%}
{%load staticfiles%}
{%load gravatar%}
{%block content%}
{%csrf_令牌%}
{{form}}
这样设置模板。

{%endblock content%}

社区和用户之间是否存在关系?您打算如何存储用户是社区成员这一事实?请查看我的编辑。我有一个存储社区首选项的UserProfile对象,但我不知道如何将所有内容链接在一起。谢谢!好的,我可以看到社区对象在终端中打印出来,但当我加载实际表单时,浏览器中没有显示任何内容。我上传了我的模板以及我是如何设置URL和视图的,你介意看一下吗?只要看到表单去掉了标签上的所有内容,就保留csfr、{{form}和一个提交按钮。您可以稍后再进行样式设置。为什么url中有两个$符号。我不确定这是否会影响到我,但我觉得没有其他问题。确保呈现了预期的html。很好的捕获和修复,但仍然存在相同的问题。您是否至少看到页面上的“提交”按钮?那应该是存在的
{% 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>