【问题标题】:how to store in the database the value of choicefiled in model using django如何使用django将choicefiled的值存储在数据库中
【发布时间】:2019-03-05 11:01:14
【问题描述】:

我有一个表单,允许用户通过填写​​文本字段并选择其中一个单选按钮来向数据库输入新记录。

系统正常工作并保存文本字段的数据,但单选按钮始终为空。 但是,如果我打印单选按钮的值,它的打印正确。

models.py

class Person(models.Model):
    boolChoice = (
        ("M","Male"),("F","Female")
        )

    name = models.CharField(max_length=50)
    date = models.DateField()
    description = models.TextField()
    gender = models.CharField(max_length = 1,choices=boolChoice)

    def __str__(self):
        return str(self.name)

addPerson.html

{% extends 'base.html' %}

{% block content %}

<div class="hero__content">
   <form method="POST" class="form-style-9">{% csrf_token %}
        {{ form.as_p }}


<ul>

    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<li>
    <h2>Add Member</h2>

</li>

<li>
    <input type="text" name="name" class="field-style field-split align-right" placeholder= "enter ur name " id="name"/>
</li>
<li>
    <input type="date" name="date" class="field-style field-full align-none" placeholder= " your birthdate" id="birthdate" />

</li>
<li>
    <input type="radio" name="gender"  value="male"> Male<br>
    <input type="radio" name="gender"  value="female"> Female<br>

</li>

<li>
<textarea name="description" class="field-style" placeholder= "introduce yourself " id="description"></textarea>
</li>

<li>
<input type="submit" class="field-style field-full align-none" id="save" value="ADD" />
    <script type="text/javascript">
                 $(function(){
                    $('#save').on('click',function(e){
                        e.preventDefault()
                        name=$('#name').val()
                        birthdate=$('#birthdate').val()
                        description=$('#description').val()
                        radioValue = $("input[name = 'gender']:checked").val()
                        if (radioValue){
                            alert("radioValue =", radioValue)
                        }

     $.ajax({
      url:'/addperson/',
      method:'POST',
      data: {

                na:name,
                bi:birthdate,
                de:description,
                ra:radioValue
      },
      headers:{
       'X-CSRFToken':'{{csrf_token}}'
      }
     }).done(function(msg) {
                        document.location = "/home.html"     
                        alert('ﻟﻘﺪ ﺗﻢّ ﺣﻔﻆ اﻟﻤﻌﻠﻮﻣﺎﺕ')


     }).fail(function(err){
      alert('ﻟﻢ ﻳﺘﻢ اﻟﺤﻔﻆ')
     })
    })
   })
  </script>
</li>
    </ul>
</form>

  </div>


{% endblock %}

views.py

def addperson(request):
    print("request method = " , request.method)
    if request.method == "POST":
        name = request.POST['na']
        birthdate = request.POST['bi']
        description=request.POST['de']
        gender=request.POST['ra']

        person=Person.objects.create(
            name=name,
            date=birthdate,
            description=description,
            gender = gender
        )
        print("name  = ", name + "birthdate = " , birthdate + "dec = ", description + "gender = " , gender)
        person.save()

        return render(request,'./addPerson.html')

    else:
        print("this is a get METHOD")

【问题讨论】:

  • gender 在你的模型中是一个 charField,所以会被存储为一个 Char Field
  • 性别应该是“M”或“F”之一
  • 打印出您在视图中看到的性别。 print("性别",性别)
  • @MohitHarshan 它打印性别 = 男性
  • 很明显,因为您设置了value="male"。但是你想要“M”,因为这是应该保存在数据库中的值。

标签: django database radio-button modelchoicefield


【解决方案1】:

您必须将单选按钮的值设置为与choiceField 的第一个索引相同。我强烈建议您将表单用于这种简单的用例,因为您可以立即获得很多东西。

<input type="radio" name="gender"  value="M"> Male<br>
<input type="radio" name="gender"  value="F"> Female<br>

你可以像这样创建 PersonFrom:

class PersonForm(model.ModelForm):
    class Meta:
        model = Person

在视图中:

if request.method == "POST":
        person_form = PersonForm(request.POST)
        if person_form.is_valid():
            person_form.save()

        return render(request,'./addPerson.html', {'person_form': person_form })

else:
    print("this is a get METHOD")

您需要更新模板才能使用表单。你可以阅读更多关于它的信息here

【讨论】:

  • 我尝试了您的答案并创建了一个 modelForm,但现在它没有;没有将任何插入记录保存到数据库中,但它提醒我数据已保存。跨度>
  • 您还需要更新模板。它没有保存,因为我猜数据无效。 ajax 的 data 参数必须与表单字段的名称相同。 data: { name:name, birthdate:birthdate, description:description, gender:radioValue }
【解决方案2】:

您应该使用django.forms 来处理和验证数据。 https://docs.djangoproject.com/en/2.1/topics/forms/

在您的 Person 模型中添加选择枚举:

class Person(models.Model):

    GENDER_MALE = 'M'
    GENDER_FEMALE = 'F'
    GENDER_CHOICES = (
        (GENDER_MALE, 'Male', ), 
        (GENDER_FEMALE, 'Female', ), 
    )

    name = models.CharField(max_length=50)
    date = models.DateField()
    description = models.TextField()
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

    def __str__(self):
        return str(self.name)

在您的 PersonForm 覆盖字段小部件中:

from django import forms

class PersonForm(forms.ModelForm):

    gender = forms.ChoiceField(choices=Person.GENDER_CHOICES, widget=forms.RadioSelect())

    class Meta:
        model = Person

【讨论】:

  • 不需要覆盖表单字段,因为设置了choices 的模型字段将自动成为ChoiceField。您只想覆盖默认小部件(RadioSelect 而不是 Select)。
猜你喜欢
  • 2016-04-08
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
相关资源
最近更新 更多