布尔值作为复选框并保存表单

时间:2018-12-22 13:40:21

标签: django

我为某些用户首选项复选框创建了一个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

我了解将表单与登录用户相关联会遇到麻烦,但是我不确定应该采用哪种正确的方式进行关联

1 个答案:

答案 0 :(得分:0)

您使用的NullBooleanField可以具有3个值:NoneTrueFalse。因此,呈现此类字段的默认小部件为下拉列表。如果您想要一个复选框,则应该确定要映射到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})