【问题标题】:Unable to post data to foreign key table in Django无法将数据发布到 Django 中的外键表
【发布时间】:2022-01-04 02:24:26
【问题描述】:

我是 Django 的绝对初学者,我正在尝试通过将值填充到外键表来检查 POST 方法。我有两张桌子。请指导我哪里错了。

  1. 具有 2 个条目的类别表,即 Coffee(PK = 1) 和 Desserts (PK = 2)
  2. 项目表

来自 models.py:

class Category(models.Model):
    cId = models.AutoField(primary_key=True)
    categoryName = models.CharField(max_length=20, unique=True)

    def __str__(self):
        return self.categoryName
        # return[self.categoryName, self.cId]
        # return self.cId
    
class Item(models.Model):
    Id = models.AutoField(primary_key=True)
    itemName  = models.CharField(max_length=30,unique=True)
    cId = models.ForeignKey(Category,on_delete=CASCADE)

来自views.py: 定义主要(请求): 返回渲染(请求,“index.html”)

def send(request):
    if request.method == "POST":
        a = request.POST.get("a");
        b = request.POST.get("b");
        obj = Item(itemName = a, cId =b);
        obj.save()
        
        return HttpResponse("sent")
    else:
        return HttpResponse("form submission failed")

来自 urls.py(app):

urlpatterns = [
    path('', views.main, name="main"),
    path('send', views.send, name='send')
   
]

来自 HTML:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    {% load static %}

    <link rel="stylesheet" href="{% static 'css.css' %}">

    <title>CHECK-POST-METHOD</title>
</head>

<body>
    <div class = "container">
        <form method = "post" action = "send" class = "form">
            {% csrf_token %}
            <label for="a">Item Name</label>
            <input type="text" name="a" id="a" maxlength="30">
            <label for="b">PASS FOREIGN KEY--CATEGORY ID</label>
            <input type="number" name="b" id="b" maxlength="5">
            <button type="submit">SUBMIT</button>

        </form>

    </div>

    <script src="{% static 'js.js' %}"></script>
  
</body>

</html>

我无法使用以下条目填充项目表:

我无法解决以下错误:

【问题讨论】:

    标签: python mysql django foreign-keys


    【解决方案1】:

    由于cId需要是Category类型的对象,你可以使用Django的get_object_or_404函数。如果从 HTML 发布的 cId 无效,则此函数会自动引发 404 响应。

    from django.shortcuts import get_object_or_404
    
    def send(request):
        if request.method == "POST":
            a = request.POST.get("a");
            b = request.POST.get("b");
            b_obj = get_object_or_404(Category, b)
            obj = Item(itemName = a, cId =b_obj)
            obj.save()
            
            return HttpResponse("sent")
        else:
            return HttpResponse("form submission failed")
    

    【讨论】:

      【解决方案2】:

      正如它在错误中指出的那样,Cid 必须是类别的实例 所以您的视图如下所示:

      def send(request):
          if request.method == "POST":
              a = request.POST.get("a");
              b = request.POST.get("b");
              c_id = Category.objects.get(pk=b)
              obj = Item(itemName=a, cId=b);
              obj.save()
      
              return HttpResponse("sent")
          else:
              return HttpResponse("form submission failed")
      

      【讨论】:

        【解决方案3】:

        cId 需要一个 Category 对象,但你已经给了它'1'。如果您想为名为 fooForeignKey 指定主键,则使用 <i>foo</i>_id,因此在本例中为 cId_id

        def send(request):
            if request.method == 'POST':
                a = request.POST.get('a')
                b = request.POST.get('b')
                obj = Item(itemName=a, cId_id=b)
                obj.save()
                
                return HttpResponse("sent")
            else:
                return HttpResponse("form submission failed")

        【讨论】:

        • @Willem Van Onsem 先生,您是一颗宝石!感谢您的帮助。
        • 在我的 Django 管理员上,所有列都没有这个标题,即“cId_id”,但在我的 MySQL 中,我的表中有这个“cId_id”属性,其中包含项目。请指导如何在仅使用 django admin 时识别属性的正确名称。谢谢。
        • @Hasnain:如果你定义了一个ForeignKey,Django 将创建一个带有columnname_id 的数据库列,所以带有一个_id 后缀。这个dus表示数据存放在cId_id列中,这也是控制ForeignKey的属性。
        • @Hasnain:它将在对象上调用str(...),因此您可以传递任何对象,但它会将其转换为字符串(并且本身并不是说可以重建对象如果不是字符串)。
        • @Hasnain:如果是整数字段,则数据库列是整数字段,Django 会在对象上调用int(..),然后再将其传递给数据库。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-20
        • 2018-11-02
        • 1970-01-01
        • 2021-04-11
        • 2019-11-07
        • 1970-01-01
        相关资源
        最近更新 更多