我想编辑我的产品详细信息Django

时间:2018-07-11 10:51:30

标签: django django-models django-forms django-templates django-views

我现在想编辑使用POST方法使用表单收集的详细信息。我试过了,但是没有用,你们能告诉我我在做什么错吗?

编辑帖子的视图

@login_required()
def edit_product(request, product_id):
    form = NewPro()
    edit = get_object_or_404(Product, product_id)
    if request.method == 'POST':
        form = NewPro(request.POST, request.FILES)
        if form.is_valid():
            form.save()

            return redirect('product')
        else:
            form = NewPro()
    return render(request, "default/edit.html", {'form': form, 'edit': edit}) 

网址模式

path('<int:product_id>/edit_product', views.edit_product, name='edit_product')

我要在其中添加按钮的HTML

{% extends 'default/dashboard.html' %}
{% block content %}
    <h1>Products Details </h1>
    <p>These are the details of your product, {{ user.username }}</p>
       <ul>
       <li>{{ product_details.name }}</li>
       <li>{{ product_details.price }}</li>
       <li>{{ product_details.category }}</li>
       <li>{{ product_details.store }}</li>
       <li>{{ product_details.user }}</li>

       </ul>
      <a href={% url 'edit_product' edit.id %}>
      <button>Edit Product</button>
      </a>
{% endblock %}

我要显示表单的HTML

{% extends 'default/dashboard.html' %}
<html>
<head><title>E-Commerce App</title></head>
 {% block content %}
    <h2>Edit Product</h2>
    <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">submit</button>
   </form>
{% endblock %}
</html>

我想用这张卡代替你给我的那张卡。

<div class="card-deck">
  <div class="card">
    <img class="card-img-top" src=".../100px200/" alt="Card image cap">
    <div class="card-body">
      <h5 class="card-title">Card title</h5>
      <p class="card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
      <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
    </div>
  </div>
  <div class="card">
    <img class="card-img-top" src=".../100px200/" alt="Card image cap">
    <div class="card-body">
      <h5 class="card-title">Card title</h5>
      <p class="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
      <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
    </div>
  </div>
  <div class="card">
    <img class="card-img-top" src=".../100px200/" alt="Card image cap">
    <div class="card-body">
      <h5 class="card-title">Card title</h5>
      <p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.</p>
      <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
    </div>
  </div>
</div>

1 个答案:

答案 0 :(得分:1)

您必须将要编辑的产品实例传递给表单。

@login_required()
def edit_product(request, product_id):

    product_to_edit = get_object_or_404(Product, pk=product_id)
    form = NewPro(instance=product_to_edit)
    if request.method == 'POST':
        form = NewPro(request.POST, request.FILES, instance=product_to_edit)
        if form.is_valid():
            form.save()

            return redirect('product')
        else:
            form = NewPro(instance=product_to_edit)
    return render(request, "default/edit.html", {'form': form, 'product': product_to_edit})

在评论中,您询问了如何显示卡内的所有产品,以便每行有4个产品。试试吧!

<div class="container">
    <div class="row">
        {% for product in products %}
          <div class="col-sm-3">
               <div class="card" style="width: 18rem;">
                  <img class="card-img-top" src="..." alt="Card image cap">
                  <div class="card-body">
                    <h5 class="card-title">{{ product.title }}</h5>
                    <p class="card-text">{{ product.description }}</p>
                    <a href="{% url "edit-product" product.id %}" class="btn btn-primary">Edit Product</a>
                  </div>
                </div>
            </div>
        {% endfor %}
    </div>
</div>

对于您提出的有关使用卡座的问题,这就是我的处理方法。

请注意:我尚未测试。

views.py:

def all_products(request):
    products = Product.objects.all()
    grouped_products = []
    temp = []
    for i in range(len(products)):
        if (i+1) % 3 == 0:
            grouped_products.append(temp)
            temp = []

        temp.append(products[i])

    return render(request, 'products.html', {'products': grouped_products})

模板:

<div class="container">
    {% for product_list in products %}
      <div class="row">
          <div class="card-deck">
              {% for product in product_list %}
                  <div class="card">
                    <img class="card-img-top" src=".../100px200/" alt="Card image cap">
                    <div class="card-body">
                      <h5 class="card-title">Card title</h5>
                      <p class="card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
                      <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
                    </div>
                  </div>
              {% endfor %}
            </div>
      </div>
    {% endfor %}
</div>