2013-07-28 2 views
0

Я начинаю изучать django и начинаю смотреть учебники о том, как создавать формы, и я видел много мест, где форма создается именно так.что именно делает django request.POST делать и как его использовать?

def create(request): 
    if request.POST: 
     form = ArticleForm(request.POST) 
     if form.is_valid: 
      form.save() 
    else: 
     form = ArticleForm() 
    args = {} 
    args.update(csrf(request)) 
    args['form'] = form 
    return render_to_response('create_article.html', args) 

Теперь, если предположить, что я создал модель под названием статьи, а затем создал ArticleForm от этой модели, что именно здесь происходит (в коде я Приведенную выше)? Я понимаю, что форма if form.is_valid: form.save(), и в соответствии с тем, что я читал, запрос всегда должен быть первым параметром, но кто-то может объяснить, какой запрос в качестве параметра выполняет и что представляют собой первые две строки функции делать? И что именно происходит в инструкции else и после выражения else (часть args)?

EDIT: Кроме того, предположим, что модель статьи имеет поле под названием name = models.CharField (max_length = 20), есть ли способ получить/получить доступ к тому, что пользователь ввел для данного раздела формы? Предположим, я хочу получить имя и посмотреть, существует ли имя в моей базе данных, будет ли способ сделать это?

ответ

1

В коде есть ошибки, и похоже, что это скопировано с вопроса SO. Я бы рекомендовал пройти через the excellent Django documentation, особенно Django tutorial.

Ваш пример должен выглядеть как this example from the Django docs.

Вот некоторые комментарии:

def create(request): 
    if request.POST: 
     form = ArticleForm(request.POST) 
     if form.is_valid: 
      form.save() 
      # after successful POST 
      # we want to redirect to a different page here 
    else: 
     form = ArticleForm() 
    args = {} 
    # you really don't need the following necessarily 
    # just use `{% csrf_token %}` inside the form in your template 
    args.update(csrf(request)) 
    args['form'] = form 
    # using just `render` like in the example linked to above is more modern 
    return render_to_response('create_article.html', args) 
+0

Хорошо, спасибо, спасибо! поэтому предположим, что модель статьи имеет поле под названием name = models.CharField (max_length = 20), есть ли способ получить/получить доступ к тому, что пользователь ввел для этого конкретного раздела формы? Предположим, я хочу получить имя и посмотреть, существует ли имя в моей базе данных, как бы я это сделал? – user216485

+1

Да, конечно. Не путайте Django Forms и Models, у них разные намерения (Forms = User Input Validation, Models = постоянство данных и доступ). Попробуйте учебник Django или раздел модели/форм документов. – stefanw

3

request.POST среди прочего (например, значение токена CSRF) содержит все данные, которые пользователь ввел в форму.

if request.POST 

проверяет, действительно ли пользователь подтвердил форму, иначе в запросе нет данных POST.

form = ArticleForm(request.POST) 

выглядит странным на первый взгляд, но когда пользователь подтверждает форму, та же страница загружена, но данные POST обрабатываются в форме Джанго для проверки данных (например, проверки, если обязательное поле было оставлено пустым, и т.д. ...), чтобы отображать ошибки в форме. Если ошибки нет (form.is_valid()), то программа просмотра продолжается.

+0

Hm хорошо, поэтому предположим, что модель Статья имеет поле, называемое именем = models.CharField (max_length = 20), есть ли способ для меня, чтобы получить/доступ, что в пользователя, введенного для данного раздела формы? Предположим, я хочу получить имя и посмотреть, существует ли имя в моей базе данных, будет ли способ сделать это? – user216485

+1

Абсолютно да, вместо «form.save()» вы можете получить данные каждого поля (очищенные формой btw) и обрабатывать их индивидуально, без необходимости сохранять их в базе данных. Я не с моим компьютером разработки django, я забыл точный синтаксис, чтобы сделать это ... –

+0

Это может быть «specificFieldName = form.cleaned_data ['specificFieldName']» например. –

1

Надеюсь, вы знакомы с HTTP methods как GET и POST.

request объект представляет собой единый запрос любым пользовательским агентом. Таким образом, это может быть запрос, который отправляется из браузера от вас при просмотре определенной страницы или с искателя из поисковой системы. Подробнее о запросе here

request.POST является атрибутом этого request объекта, это QueryDict (очень похож на обычный Dict Python). Он содержит параметры HTTP POST, которые отправляются на ваш просмотр.

Короче говоря, в вашем примере:

def create(request): 
    if request.POST: # check if the request is POST request and it contains any parameter 
     form = ArticleForm(request.POST) # then pass all those parameters to the form 
     if form.is_valid: # process the form to check if it's valid 
      form.save() # save the data if it's valid 
     else: 
      form = ArticleForm() # if not valid data, initialize an new/empty form 
    args = {} # create a dict to pass to the template 
    args.update(csrf(request)) # add the CSRF token 
    args['form'] = form # add the 'form' above to the 'args' dict 
    return render_to_response('create_article.html', args) # pass that dict to template 

Не уверен, почему у вас есть этот пример, как правило, я хотел бы сделать последнюю часть так:

def create(request): 
    .... your code .... 
    else: 
     form = ArticleForm() 
    return render(request, 'create_article.html', { form: form }) 

Надеется, что это помогает.

+0

Проверьте мой отредактированный ответ –

+0

Да, отлично, я просто понял, что то, что вы сделали, намного лучше .. ладно, так что последний вопрос будет, предположим, что модель статьи имеет поле под названием name = models.CharField (max_length = 20), есть ли способ для меня получить/получить доступ к тому, что пользователь вводил для этого конкретного раздела формы? Предположим, я хочу получить имя и посмотреть, существует ли имя в моей базе данных, как бы я это сделал? – user216485

+1

Да, вы можете получить ранее в своем представлении с помощью 'request.POST.get ('name', '')' или проверить его в своей форме, использовать форму чище. –