【问题标题】:Create Form and update using same view in django在 django 中使用相同的视图创建表单和更新
【发布时间】:2019-04-17 14:00:05
【问题描述】:

我正在尝试使用相同的视图来创建表单和更新任何对象。

我的代码如下,我尝试了很多方法都没有工作,因为我从表单中排除了 shof 并在 form.is_valid() 之后添加它会造成很多混乱。如果我更新它会创建新对象。我有两个 url,一个没有 ql(创建新),一个有 ql(更新现有),我有一个类 vdview,它提供 v.shof,需要以形式应用到 f​​.shop。请帮忙解决这个问题,

@csrf_protect
@login_required
def addmenu(request, qs, ql=None):
    v = vdview(request, qs)
    ctgobj =  get_object_or_404(v.shopcategs, pk=ql) if ql else None #  ctgobj = ShopCtg(shop=v.shof)
    if ql:
        form = ShopCtgForm(instance=ctgobj) # Tried ShopCtgForm(instance=ctgobj, data=request.POST)
    else:
        form = ShopCtgForm(data= request.POST)
    if request.method == 'POST':
        if form.is_valid():
            f=form.save(commit=False)
            f.shop = v.shof
            f.save()
            #form.save_m2m()
            return redirect('vendor-shop', qs) #thing='%s added' %f.name)
        else:
            pass
    #else:
    #    form = ShopCtgForm()
    return render(request,'vendorshop.html', {'shop':v.shof, 'shopcategs':v.shopcategs, 'form': form,
    'heading':'Create New Category', 'createcateg': 'createcateg', 'pkaddmenupk':'y'    }    )

【问题讨论】:

  • ql 代表什么?即使 ql 不是 None,您也会获得新实例?
  • 更新和创建都失败了吗?什么是 v.shof?是f.shopform.shop?你在尝试更新表单时忘记设置数据,应该是form = ShopCtgForm(instance=ctgobj, data=request.POST)
  • 抱歉,现在更新了。我将尝试使用 form = ShopCtgForm(instance=ctgobj, data=request.POST)。我会发布状态。
  • 最后这也行不通。 ` def addmenu(request, qs, ql=None): v = vdview(request, qs) ctgobj = get_object_or_404(v.shopcategs, pk=ql) if ql else None if ql: form = ShopCtgForm(instance=ctgobj, data= request.POST) print(ql) else: form = ShopCtgForm(data= request.POST) if request.method == 'POST': if form.is_valid(): f=form.save(commit=False) f.shop = v.shof f.save() #form.save_m2m() return redirect('vendor-shop', qs) else: pass`

标签: django django-forms


【解决方案1】:

使用try 块来处理这两种情况。下面的简化示例将查找给定的模型实例pk,如果找不到,则假定您要创建它。如果模型实例不存在,try 将防止 django 抛出错误。相反,它只会返回空模型表单。

它首先在模板(第一个try 块)中呈现正确的表单,然后在request.method == 'POST': 之后的第二个try 块中再次呈现正确的表单,以提交新数据或更新现有数据。

Views.py

from .models import Books
from .forms import BookForm

def create_and_update_book_view(request, pk):

    books = Books.objects.get(id=pk)

    try: # get pre-populated form with model instance data (for update)
        form = BookForm(instance=books.id) 
    except: # If it doesn't exist, show an empty form (for create)
        form = BookForm(request.POST or None)

    if request.method == 'POST':
        try: # Do the same as above
            form = BookForm(instance=books.id)
        except: # Same as above
            form = BookForm(request.POST or None)
        if form.is_valid():
            form.save()

    return render(request, "create_and_update_book_page.html", {'form':form})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 2019-02-02
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多