【问题标题】:Django model from create a new record instead of updating old oneDjango 模型从创建新记录而不是更新旧记录
【发布时间】:2020-07-08 01:05:45
【问题描述】:

我是 Django 的初学者。我的问题是我更新了我的记录,但它正在添加新记录而不是更新旧记录。

我哪里做错了?

views.py


class EditProduct(TemplateView):
    template_name = 'stock/editproduct.html'

    def get(self, request, product_id):
        productedit = get_object_or_404(Product, pk=product_id)
        data=Product.objects.get(id=product_id)
        form = EditProductForm(instance=data)
        args = {'form':form, 'productedit':productedit}
        return render(request, self.template_name, args)

    def post(self, request, product_id):
        form = EditProductForm(request.POST, request.FILES)
        if form.is_valid():
            productadded = form.save(commit=False)
            productadded.saler =  request.user
            productadded.pub_date = timezone.datetime.now()
            productadded.save()
            return redirect('stock')
        else:
            args = {'form': form}
            return render(request, self.template_name, args)

【问题讨论】:

  • 使用 UpdateView 代替模板视图,这对你来说会更容易
  • @bmons 只是将模板视图更改为 UpdateView??还是还需要一些功能?
  • 您的表单是一个新实例的表单,当您希望表单更新现有实例时,您需要将要更新的 instance 传递给它 (form = EditProductForm(request.POST, request.FILES, instance=product_to_update) )。与您在 get() 方法中所做的相同。
  • 等等你为什么定义form两次???正如我在第一条评论中提到的那样,只需form = EditProductForm(request.POST, request.FILES, instance=data)

标签: python django python-3.x model record


【解决方案1】:

我假设 stock 是包含 views.py、models.py、url.py 的应用程序/文件夹的名称。

views.py 请参阅 here 以获取 UpdateViews 的文档。

from django.views.generic import UpdateView
from django.utils import timezone
from stock.models import Product
from stock.forms import EditProductForm 

Class ProductUpdateView(UpdateView):
    model = Product
    form_class = EditProductForm
    success_url = reverse_lazy('stock:product_list')
    template_name = 'stock/editproduct.html'

    def form_valid(self, form):
        form.instance.saler =  self.request.user
        form.instance.pub_date = timezone.now()
        return super().form_valid(form)

urls.py

from stock import views

app_name = 'stock'
urlpatterns = [
    path('product/update/<int:pk>', views.ProductUpdateView.as_view(), name='product_update'),
    path('product/list', views.ProductListView.as_view(), name='product_list'
]

下面的sn-p可以添加到你要更新的产品页面的html中,这个一般是detailsviews类或者函数生成的产品详情页面。

在该页面上添加一个按钮,将您带到更新页面,传递您要更新的产品的 ID。

<a class="btn btn-outline-warning waves-effect" href="{% url 'stock:product_update' pk=product.pk %}"> Update product</a>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多