我为某些用户首选项复选框创建了一个OnetoOne模型。这被映射到用户,并使用创建用户时创建的信号。这是我到目前为止的内容:
型号:
class DateRegexes(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
prefix_1 = models.NullBooleanField()
prefix_2 = models.NullBooleanField()
prefix_3 = models.NullBooleanField()
prefix_4 = models.NullBooleanField()
prefix_5 = models.NullBooleanField()
prefix_6 = models.NullBooleanField()
prefix_7 = models.NullBooleanField()
prefix_8 = models.NullBooleanField()
prefix_9 = models.NullBooleanField()
@receiver(post_save, sender=User)
def create_date_regexes(sender, instance, created, **kwargs):
if created:
DateRegexes.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_date_regexes(sender, instance, **kwargs):
instance.date_prefs.save()
表格:
class DatePreferenceForm(forms.ModelForm):
class Meta:
model = DateRegexes`
查看:
@login_required
def set_date_preferences(request):
if request.method == 'POST':
form = DatePreferenceForm(request.POST)
if form.is_valid():
form.save()
else:
date_prefs = get_object_or_404(DateRegexes, user=request.user)
form = DatePreferenceForm(instance = request.user.date_prefs)
return render(request, 'set_date.html', {'form': form})
模板:
{% extends 'base.html' %}
{% block title %}Date Preferences{% endblock %}
{% block content %}
{% if user.is_authenticated %}
<p><a href="{% url 'logout' %}">logout</a></p>
<form method="post">
{% csrf_token %}
{% for field in form.visible_fields %}
<div>here {{ field }}</div>
{% endfor %}
<button type="submit">Set</button>
</form>
</div>
{% else %}
<p>You are not logged in</p>
<a href="{% url 'login' %}">login</a>
{% endif %}
{% endblock %}
当我执行此操作时,首先发生的是根据他们先前选择的首选项填写的预期复选框,我得到了一堆投币箱,每个投币箱都说: “未知”,“是”,“否”。
1)如何显示html复选框而不是dropbox?
2)提交表格时,我得到:
IntegrityError at /db/set_date_preferences/
NOT NULL constraint failed: db_dateregexes.user_id
我了解将表单与登录用户相关联会遇到麻烦,但是我不确定应该采用哪种正确的方式进行关联
答案 0 :(得分:0)
您使用的NullBooleanField
可以具有3个值:None
,True
或False
。因此,呈现此类字段的默认小部件为下拉列表。如果您想要一个复选框,则应该确定要映射到None
的内容,并将DatePreferenceForm
中的字段覆盖为BooleanField
。
第二,由于每个user
已经拥有prefs
,因此即使在POST
情况下,也应使用正确的实例初始化表单。我真的不明白您的form
如何有效,因为user
是必填字段(您应该从表单中排除它)。
class DatePreferenceForm(forms.ModelForm):
class Meta:
model = DateRegexes
exclude = ['user']
# View
def set_date_preferences(request):
if request.method == 'POST':
form = DatePreferenceForm(request.POST, instance=request.user.date_prefs)
if form.is_valid():
form.save()
# would be good practice to redirect to a success page here
else:
date_prefs = get_object_or_404(DateRegexes, user=request.user)
form = DatePreferenceForm(instance = request.user.date_prefs)
return render(request, 'set_date.html', {'form': form})