【问题标题】:How to save foreign from html form (select)?如何从 html 表单中保存外文(选择)?
【发布时间】:2020-01-16 14:52:05
【问题描述】:

我无法从表单中为 ForeignKey 保存适当的值。 ForeignKey 的值总是写入数据库,id = 1。 在 html 格式中,我的模型中的值(在数据库中)被输出到 select。但是从表单发送数据时,forgonekey类型的字段的值一直以id = 1的方式写入数据库

models.py:

class Sportsman(models.Model):
first_name = models.CharField(max_length=64, blank=True, null=True, default=None, verbose_name='Имя')
last_name = models.CharField(max_length=64, blank=True, null=True, default=None, verbose_name='Фамилия')
gender = models.ForeignKey(Gender, on_delete=models.CASCADE, null=True, blank=True, default=True, verbose_name='Пол')
tournament = models.ForeignKey(Tournament, null=True, blank=True, default=True, on_delete=models.CASCADE, verbose_name='Турнир')

def __str__(self):
    return "Спортсмен(ка): %s %s, почта: %s" % (self.first_name, self.last_name, self.email)

class Meta:
    verbose_name = 'Спортсмен'
    verbose_name_plural = 'Спортсмены'

def save(self, *args, **kwargs):
    super(Sportsman, self).save(*args, **kwargs)

forms.py:

class SportsmenForm(forms.ModelForm):

class Meta:
    model = Sportsman
    exclude = ['created', 'updated']

views.py:

def sportsman(request):
documents = Document.objects.filter(is_active=True)

form = SportsmenForm(request.POST or None)

if request.method == "POST" and form.is_valid():
    print(request.POST)
    print(form.cleaned_data)
    print(form.cleaned_data['email'])
    form.save()
    new_form = form.save()

return render(request, 'sportsman/sportsman.html', locals())

<QueryDict: {'csrfmiddlewaretoken': ['BzBeiKE82LDcd3tmdzZGSmpOWQatc52SSO7ScEOm7eCVdXsHQWxerSzTZa6KC5xq'], 'first_name': ['test_name'], 'last_name': ['test_name'], '<select name=': ['3']}

>

【问题讨论】:

    标签: django python-3.x database forms django-queryset


    【解决方案1】:

    尝试以下方法,对我来说效果很好。

    if request.method == "POST":
        form = SportsmenForm(request.POST)
        if form.is_valid():
            instance = form.save(commit=False)
            instance.save()
    

    为了在模板中使用表单,您不需要声明输入,Django 会为您完成。您只需使用以下示例中的表格。只需将表单字段添加为变量即可获得正确的外键选项。

    <form action="{% url 'your_destination_view' %}" method="post">
        {% csrf_token %}
    
        {{ form.first_name }}
        {{ form.last_name }}
        {{ form.gender }}
        {{ form.tournament }}
    
        <div><input type="submit" value="OK" name="form"></div>
    </form>
    

    【讨论】:

    • 我更改了我的 views.py 的内容并选择来自我的 html 表单(我的外键值的选择)。现在有一个空字段。但我认为这是在正确的轨道上。我是否需要以某种方式将外国人带入我的 html 选择中? &lt;div class="form-select"&gt; &lt;label for="tournament"&gt;Турнир&lt;/label&gt; &lt;select name="{{ form.tournament }}"&gt;&lt;/select&gt; &lt;/div&gt;
    • 我会在一分钟内扩展我的答案,但您不需要在模板中声明选择输入,Django 表单会为您完成。
    • 成功了!我不明白为什么对分类形式没有任何作用。不过现在不重要了!非常感谢!
    • 完美。请将答案标记为正确,以便人们知道有解决方案。最好的!
    【解决方案2】:

    当我们使用 default=True 并且没有从表单发送任何值然后 django 保存第一个表值即 1 所以删除 blank=True 和 default=True 到将 null 保存在数据库中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-05
      • 2023-04-09
      • 2019-08-24
      • 1970-01-01
      • 2013-12-02
      • 2013-10-11
      • 2020-10-12
      相关资源
      最近更新 更多