簡體   English   中英

如何將主鍵傳遞給 url Django

[英]How can pass primary key to url Django

我基本上有3個問題

  1. 我試圖在創建它之后在 url 中傳遞供應商的主鍵,但是當我 go 供應商頁面時,它顯示錯誤“反向為 'vendorCategory' 與 ZDBC11CAA5BDA99F77E6FB4DA.8 未找到嘗試了 1 種模式:['vendorCategory/(?P<vendor_id>[0-9]+)/$']'

  2. 在供應商類別中,當我嘗試針對特定供應商存儲多個產品時,它會顯示錯誤“Field id int but You got ['12', '11']”

  3. 在供應商類別模板中,當我 select 任何類別時,它只顯示我添加的最后一個類別

視圖.py

class Vendor(TemplateView):

     template_name = 'purchase/vendor.html'

     def get(self, request, *args, **kwargs):
         return render(request, self.template_name)

     def post(self, request, vendor_id):
        try:
           data = self.request.POST.get
           vendor = VendorModel(
                name=data('name'),
                email=data('email'),
                Contact_No=data('Contact_No'),
                address=data('address')
           )
           vendorId = vendor.objects.get(pk=vendor_id)
           vendor.save()
           
           return redirect('vendorCategory', args={'vendor': vendorId})
        except Exception as e:
           return HttpResponse('failed{}'.format(e))


class Vendor_Category(TemplateView):

    template_name = 'purchase/vendorCategory.html'

    def get(self, request, vendor_id=None, *args, **kwargs):
        categories = CategoryModel.objects.all()
        categoryId = self.request.GET.get('SelectCategory')
        products = ProductModel.objects.filter(category_id=categoryId)
        vendor= VendorModel.objects.get(id=vendor_id)
        args = {'categories': categories, 'products': products, 'selectedCategory':  categoryId, 'vendor': vendor}
        return render(request, self.template_name, args)

   def post(self, request):

       categoryobj = self.request.GET.get('SelectCategory')
       productobj = self.request.POST.getlist('ProductSelect')

       try:
          vendor = VendorCategory(
              vendor_id=self.request.vendor_id,
              category_id=categoryobj,
              product_id=productobj

          )
          vendor.save()
          return redirect('menu')
       except Exception as e:
           return HttpResponse('failed{}'.format(e))

網址.py

urlpatterns = [

   path('vendorCategory/<int:vendor_id>/', Vendor_Category.as_view(), name='vendorCategory')
   path('vendor', Vendor.as_view(), name='vendor'),
]

模板

VendoreCategory.html

   {% extends 'auth/home.html' %}

  {% block content %}

<form method="get">
{% csrf_token %}
    <label>
        <select name="SelectCategory" >
        <option disabled="disabled" value="True" selected="{{ selectedCategory|yesno:"yes, no"|safe }}"> Select Category</option>
            {% for category in categories %}
            <option value="{{ category.id }}" selected="{% if category.id == selectedCategory %} {% endif %}">
                {{ category.name }}
            </option>
            {% endfor %}
        </select>
    </label>

    <input type="submit" value="Select">
</form>
<form method="post">
<input type="hidden" value={{  selectedCateogry }} name="ProductSelect">
{% csrf_token %}
<label>
    {% for product in products%}
    <input type="checkbox" name="ProductSelect" value="{{ product.id }}" >{{ product.name }}
    {% endfor %}
    </label>
<input type="submit" value="Select">


</form>

{% endblock %}

廠商.html

   {% extends 'auth/home.html' %}

{% block content %}
<form method="post">
 {% csrf_token %}
    <label for="name">Name
        <input type="text" name="name" id="name" placeholder="Enter vendor name">
    </label>
    <label for="email">Email
        <input type="email" name="email" id="email" placeholder="Enter vendor's email address">
    </label>
    <label for="Contact_No">Contact no
        <input type="number" name="Contact_No" id="Contact_No" placeholder="Enter vendor contact no">
    </label>
    <label for="address">Address
        <input type="text" name="address" id="address" placeholder="Enter vendor address">
    </label>
    <button type="submit">Submit </button>
</form>
 {% endblock %}

我認為您的問題是您正在擴展TemplateView ,然后將其視為View

如果您覆蓋TemplateView ,您應該閱讀get_context_data方法中的 kwargs。 如果您更喜歡“動手方法”(就像我自己一樣),那么擺脫TemplateView並擴展普通View ,然后覆蓋getpost方法(就像您現在所做的那樣)。

from django.views import View

編輯:我又看了一遍

錯誤一:

也許試試這個?

def get(self, request, *args, **kwargs):
    categories = CategoryModel.objects.all()
    categoryId = self.request.GET.get('SelectCategory')
    products = ProductModel.objects.filter(category_id=categoryId)
    vendor= VendorModel.objects.get(id=self.kwargs['vendor_id'])
    args = {'categories': categories, 'products': products, 'selectedCategory':  categoryId, 'vendor': vendor}
    return render(request, self.template_name, args)

在 URL 中,您要的是 kwarg(vendor_id),但我沒有看到您在任何地方使用它。 每次您 go 到該路徑並且無法指定請求的 kwarg 時,也會出現該錯誤。 因此,當您嘗試運行 VendorCategory 視圖時,請確保您的 url 末尾有 /1/ 或其他內容。

錯誤2:

您正在嘗試將列表分配給 int 變量。 難怪它不起作用。 我的建議是添加:

print(self.request.POST.getlist('ProductSelect'))

在您的發布方法中,看看會發生什么。 然后你可以用devise的方法來解壓存放。 我的意思是,我們已經知道這是一個列表..所以你顯然不能為你正在創建的單個 object 分配多個 ID。 您應該首先創建一個供應商,然后有一個產品創建循環將產品添加到該供應商。 像這樣的東西可能會起作用:

categoryobj = self.request.GET.get('SelectCategory')
productobj = self.request.POST.getlist('ProductSelect')

try:
  vendor = VendorCategory.objects.create(
      vendor_id=self.request.vendor_id,
      category_id=categoryobj,
  )
  vendor.save()
  for product_id in productobj:
    product = ProductModel.objects.get(id=product_id)
    product.vendormodel = vendor
    product.save()

現在..我認為你在寫vendor = VendorCategory(或者至少我從未見過這種語法而且我不知道它應該完成什么的地方有一個錯誤。在我的版本中,我用VendorCategory.objects.create ,因為那是我假設你試圖做的。

錯誤 3:

在模板中,您正在使用帶有int值的|yesno過濾器。 您是否想了解是否有 id?

您正在運行一個for循環,在該循環中您可能會使用 select 多個值,在這種情況下,該項目應該有一個“多個”。 <select name="asdsad" multiple>

我覺得你有一個包裹整個<select><label>很奇怪。 <label>應該有for="field_id"就是這樣。 除了非常特殊的情況。

最后但並非最不重要的一點是,您有一個錯字:

<input type="hidden" value={{  selectedCateogry }} name="ProductSelect">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM