Ввод HTML-формы Django в db.sqlite3 - PullRequest
       13

Ввод HTML-формы Django в db.sqlite3

0 голосов
/ 02 октября 2019

Я делаю простой веб-сервер, чтобы взять входные данные html и вставить их в таблицу базы данных.

Я пробовал с запросом POST попал в другие проблемы CSRF, Перешел к запросу GET, чтобы перейтиCSRF (не обязательно в моем случае), все еще не в состоянии получить данные HTML в базу данных.

myapp / models.py

from django.db import models


class Post(models.Model):
    title = models.CharField(max_length=300, unique=True)
    content = models.TextField()

myapp / templates / createpost.html

<head>
<title>Create a Post </title>
</head>

<body>
<h1>Create a Post </h1>
<form action="" method="GET">
    {%csrf_token%}
    Title: <input type="text" name="title"/><br/>
    Content: <br/>
    <textarea cols="35" rows="8" name="content">
        </textarea><br/>
    <input type="submit" value="Post"/>
</form>
</body>

</html>

myapp / views.py

from django.shortcuts import render
from .models import Post


def createpost(request):
    if request.method == 'GET':
        if request.GET.get('title', None) and request.GET.get('content', None):
            post = Post()
            post.title = request.GET.get('title', None)
            post.content = request.GET.get('content', None)
            post.save()
        return render(request, 'createpost.html')
    else:
        return render(request, 'createpost.html')

urls.py

from django.contrib import admin
from django.urls import path, include
from django.views.generic.base import TemplateView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', TemplateView.as_view(template_name='createpost.html'), name='createpost'),
]

Я использую Django 2.2.6 с сообществом PyCharm 2019.2.3 Я искал почти 2 дня, проверил django doc и ответы на stackoverflow, ни один из них не помог, мне пришлось спроситьчтобы убедиться, что это не связано с версией, и прости меня, если я скучаю, пойми простой момент - я только начинающий.

1 Ответ

1 голос
/ 02 октября 2019

Я пытался с запросом POST получить больше проблем с CSRF, Обратился к GET-запросу, чтобы перейти через CSRF (в моем случае это не нужно), но все еще не смог его сделать.

Хорошо.

ОСТАНОВИТЬ ВСЕ ПРЯМО СЕЙЧАС

Теперь

  1. сделать официальный учебник по Django и научиться использовать формы и модели Django
  2. прочитайте спецификацию HTTP о правильном использовании GET-запросов (подсказка: здесь важно слово "idempotent")
  3. исправьте ваш код соответственно
  4. , если к тому времени вы все еще есть проблемы с токеном csrf, вернитесь и опубликуйте вопрос об этом (с соответствующим MCVE и т. д.).

Также обратите внимание, что ваш вопрос должен быть сформулирован как неясный или OT, так как вы не делали 'Не объясните, в чем ваша проблема (подсказка: «не работает» ничего не объясняет). Но в любом случае ...

То, что вы хотите (nb: модели без изменений):

myapp / forms.py

from django import forms
from . models import Post

class PostForm(forms.ModelForm):
    class Meta(object):
        model = Post
        fields = ("title", "content")

views.py

from django.shortcuts import redirect, render
from . models import Post
from . forms import PostForm

def createpost(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            # read the doc for `redirect` and change the destination to
            # something that makes sense for your app.
            # as to why we redirect, cf  https://en.wikipedia.org/wiki/Post/Redirect/Get
            return redirect("/")

    else:
        # GET request, present an empty form
        form = PostForm() 
    return render(request, 'createpost.html', {"form": form})

urls.py

from django.contrib import admin
from django.urls import path, include

# NB: actually you should define myapp's urls in 
# myapp/urls.py and `include` them here
from myapp.views import createpost

urlpatterns = [
    path('admin/', admin.site.urls),
    path('/', createpost, name='createpost'),
]

myapp / templates / createpost.html

<head>
  <title>Create a Post </title>
</head>

<body>
  <h1>Create a Post </h1>
  <form action="" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Post"/>
   </form>
</body>

</html>

Я не могу гарантировать, что это будет работать из коробки (мне придетсяопубликовать полный проект с правильными настройками и т. д., чтобы быть уверенным - и на самом деле проверить его хотя бы один раз на опечатки и т. д.), но это верный способ сделать все.

Я искал почти 2days

Это 2 дня впустую, что вам лучше использовать официальный учебник по Django. Я также предлагаю вам научиться отлаживать программы - просто добавив пару вызовов «print (« XXX »)» в ваше представление и проверив выходные данные вашего devserver, стало бы понятно, почему ничего не было создано в вашей базе данных (подсказка: с вашим исходным urls.py,Вы НИКОГДА не вызываете функцию просмотра).

...