我需要帮助来获取用户首选项以保存到数据库。我有以下模型定义的一组社区对象:
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,如下所示:
url(r'^join-communities/(?P<user_id>\d+)/$', views.joinCommunities, name='qa_join_communities')
问题在于,当我提交表单时,该表单没有保存,并且出现此错误:
'CommunitySelectForm' object has no attribute 'save'
答案 0 :(得分:0)
您可以创建如下表单:
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>
像这样设置模板。
{%endblock content%}