2017-01-29 56 views
0

我是Django的新手,并且有一个Q &一个项目。对于每个问题,您可能会有多个已存在的标签或放置新的标签。问题保存之前应该创建新的标签。我如何正确解决这个问题?到目前为止,我有:Django在保存新对象之前添加主键

def question_add(request): 
    # redirect user to login page if not authenticated 
    if not request.user.is_authenticated(): 
     return render(request, 'account/login.html') 

    # if this is a POST request we need to process the form data 
    if request.method == 'POST': 
     # create a form instance and populate it with data from the request: 
     form = QuestionForm(request.POST) 

     if form.is_valid(): 
      # process the data in form.cleaned_data as required 
      instance = form.save(commit=False) 
      instance.created_by = request.user 
      instance.save() 

      messages.success(request, 'Question added with success.') 
      # redirect to the main page: 
      return HttpResponseRedirect('/') 
     else: 
      messages.warning(request, 'Please correct the errors.') 

    # if a GET (or any other method) we'll create a blank form 
    else: 
     form = QuestionForm() 

    return render(request, 'question/add.html', {'form': form}) 

这应该是做事先form.is_valid()或者是否存在这样一个神奇的方法?

+0

尝试在你的'form.is_valid()',两个'.save()'功能之间。 –

+1

备注:要重定向未经身份验证的用户,您可以使用login_required装饰器:https://docs.djangoproject.com/en/1.10/topics/auth/default/#django.contrib.auth.decorators.login_required –

+0

@AdamStarrh :你有一个例子...? thx – cwhisperer

回答

0

我假设tag是ManyToMany字段的问题模型。

Inside form.is_valid()添加manyToMany字段数据。

if form.is_valid(): 
    instance = form.save(commit=False) 
    instance.created_by = request.user 
    instance.save() 
    # returns the list of tag names 
    tags = request.POST.get('tags') 
    for tag in tags: 
     # create if tag not found with given name or return existing tag 
     obj, created = Tag.objects.get_or_create(name=tag) 
     instance.tags.add(obj) 

如果标签是ForiegnKey:

if form.is_valid(): 
    instance = form.save(commit=False) 
    instance.created_by = request.user 
    tag_name = request.POST.get('tag') 
    obj, created = Tag.objects.get_or_create(name=tag_name) 
    instance.tag = obj.id 
    instance.save() 
+0

标记是Question模型的ManyToMany字段。但我总是收到错误信息,好像表单无效。只使用现有的标签,完美的作品。添加新标签,我收到错误信息... – cwhisperer

+0

发布具体错误?有可能你的表单试图验证你的数据库中标签是否存在。你可能需要解决这个问题。 –

相关问题