2017-01-29 4 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 для модели вопросов.

Внутри form.is_valid(), чтобы добавить много данных полевых данных.

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

tag - поле ManyToMany для модели Question. Но я всегда получаю сообщение об ошибке, похоже, что форма недействительна. Используя только теги из уже существующих, все работает отлично. Добавляя новые теги, я получаю сообщение об ошибке ... – cwhisperer

+0

Опубликовать специальную ошибку? Возможно, ваша форма пытается проверить наличие тегов как объектов в вашем db. Возможно, вам придется обойти это. –