【问题标题】:Django, why doesn't it post to db?Django,为什么不发布到数据库?
【发布时间】:2021-11-22 15:14:05
【问题描述】:

所以我制作了依赖下拉菜单,但它不会发布到数据库。我做错了什么?

另外,是否可以将其发布到不同的表?问题是,我在同一页面上有 5 个相同的表单,每个表单都在 OrderForm 上,像这样命名为 1 到 5 的模型。但它不会发布我是每页使用 1 个表单还是在同一页面上使用 5 个表单。如果有一种方法可以使用原始 sql 并将这些表单数据插入到不同的表映射字段到特定字段,我会更喜欢。

models.py

class OrderItem(models.Model):

    vendor_name = models.ForeignKey(Vendor, on_delete=models.SET_NULL, null=True)
    menu_name = models.ForeignKey(Menu, on_delete=models.SET_NULL, null=True)
    date_created = models.DateTimeField('date created', auto_now_add=True)
    note = models.CharField('note', max_length=255, null=True, blank=True)

forms.py

    class OrderForm(forms.ModelForm):
    
        note= forms.CharField(widget=forms.Textarea)
    
        class Meta:
            model = OrderItem
            fields = ('vendor_name', 'menu_name', 'note')
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['menu_name'].queryset = Menu.objects.none()
    
            self.fields['vendor_name'].widget.attrs['style'] = 'width:250px; height:25px;'
            self.fields['menu_name'].widget.attrs['style']  = 'width:250px; height:25px;'
            self.fields['note'].widget.attrs['style']  = 'width:250px; height:100px; resize:none;'

views.py

def save_order(request):
    form = OrderForm()
    if request.method == 'POST':
        form = OrderForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')
    return render(request, '/order_info.html', {'form': form})

order_info.html

<div class="">
          <form method="post" id="order_Form2" class="form2" menus-url="{% url 'ajax_load_menus' %}">
            {% csrf_token %}
            {{ form.as_p }}
            {% bootstrap_button 'Pick' button_type='submit' button_class='btn-primary btn-sm mb-2'%}
            <a class="btn btn-danger btn-sm ml-2 mb-2" href="{% url 'order-page' %}">Reset</a>
          </form>

          <script>
            $("#order_Form2 #id_vendor_name").change(function () {
              var url = $("#order_Form2").attr("menus-url");
              var vendorId = $(this).val();

              $.ajax({
                url: url,
                data: {
                  'vendor_name': vendorId
                },
                success: function (data) {
                  $("#order_Form2 #id_menu_name").html(data);
                }
              });
            });
          </script>
        </div>

load_menu.html

<option value="">---------</option>
{% for menu in menus %}
<option value="{{ menu.pk }}">{{ menu.menu_name }}</option>
{% endfor %}

url.py

urlpatterns = [
    path("order_info", views.OrderView, name="order-page"),
    path('ajax/load_menus/', views.load_menus, name='ajax_load_menus'), # AJAX\
    path('/', views.save_order, name="save_order"),
]

【问题讨论】:

    标签: python jquery django ajax


    【解决方案1】:

    您的 django 代码看起来不错。我认为您仍然必须在 jquery 中添加“类型”的问题:

          $.ajax({
                // ADD "type"
                type:'POST'
                url: url,
                data: {
                  'vendor_name': vendorId
                },
                success: function (data) {
                  $("#order_Form2 #id_menu_name").html(data);
                }
              });
    

    【讨论】:

    • 如果我把 type: 'POST' 放在那里,我会得到 Forbidden (CSRF token missing or wrong.) 错误并且依赖下拉菜单不起作用。 :(
    • 禁止(CSRF 令牌丢失或不正确。):/ajax/load_menus/ 是准确的错误消息。
    • @DC add thsi "headers: { "X-CSRFToken": getCookie("csrftoken") }," $.ajax({ })
    • 试过了,还有 const csrftoken = Cookies.get('csrftoken')。他们只是删除错误消息,但不会发布到数据库。 :(
    • 让它工作。这个问题在考虑之中。我删除了 save_order 视图并将保存表单代码合并到订单信息页面。它使它工作。 :(
    猜你喜欢
    • 2021-08-14
    • 2023-04-02
    • 2014-07-27
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    相关资源
    最近更新 更多