【问题标题】:Forms do not create new entry in database with Django表单不会使用 Django 在数据库中创建新条目
【发布时间】:2019-01-16 15:30:58
【问题描述】:

我尝试创建一个表单来创建新玩家。打开 url 效果很好,当我点击提交按钮时,我没有收到任何错误,但被重定向到主项目。 当我检查管理部分时,我看不到我之前在表单中发布的数据。此外,我在媒体目录中看不到我之前发送的图片。 在 Django 2.1 中使用表单发布信息时,数据库不会更新

我不知道我是否正确设置了 POST 请求。

也许是一个错误或我错过了什么?

模板.py

<h1>Add a new player</h1>

{% if saved %}

    <p>Player has been saved</p>

{% endif %}

<p>
    <form method="post" enctype="multipart/form-data" action=".">
       {% csrf_token %}
       {{ form.as_p }}
       <input type="submit" value="submit" />
    </form>
</p>

view.py

from game.models import Scenario, Player
from .forms import ScenarioForm, NewPlayerForm
def newplayer(request):
    saved = False
    form = NewPlayerForm(request.POST or None, request.FILES)

    if form.is_valid():
        player = Player()
        player.pseudo = form.cleaned_data['pseudo']
        player.gender = form.cleaned_data['gender']
        player.picture = form.cleaned_data['picture']
        player.save()
        saved = True

    return render(request, 'game/newplayer.html', {
        'form': form, 
        'saved': saved
    })

模型.py

class Player(models.Model):
    pseudo = models.CharField(max_length=100)
    GENDER_CHOICES = (
        ('M', 'Homme'),
        ('F', 'Femme'),
        ('O','Other'),
    )
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
    picture = models.ImageField(upload_to="images/")

    class Meta:
        verbose_name = "player"
        ordering = ['pseudo']

    def __str__(self):
        """ 
        Cette méthode que nous définirons dans tous les modèles
        nous permettra de reconnaître facilement les différents objets que 
        nous traiterons plus tard dans l'administration
        """
        return self.pseudo

Form.py

from django import forms
from .models import Scenario, Player
class NewPlayerForm(forms.Form):

    pseudo = forms.CharField(required=True)
    GENDER_CHOICES = (
        ('M', 'Homme'),
        ('F', 'Femme'),
        ('O', 'Other'),
    )
    gender = forms.ChoiceField(choices=GENDER_CHOICES, required=True)
    picture = forms.ImageField()

【问题讨论】:

    标签: database python-3.x forms django-2.0


    【解决方案1】:

    我会发表评论,但在获得 50 声望之前我不能这样做,但是...

    在您看来,在&lt;form&gt; 元素处,您有action=".",这意味着如果您提交它,它将在当前url 处运行函数。您的 newplayer() 的 urlpattern 是否指向同一页面?因为您说您将被重定向到您的主项目,但您的函数没有返回 redirect()。而且您的 return render() 并没有说它会转到 index.html 之类的东西,据我所知,这是典型的主目录。

    介意把你的网址格式放在这里吗?

    另外,由于您的视图有一个saved 变量,并且由于您的控制流,无论您做什么,您总是会得到带有&lt;p&gt;Player has been saved&lt;/p&gt; 的页面返回,因为您当前的设置使其始终存在。如果您执行了类似以下操作,那么它会正确显示该页面上的更新(但我仍然需要查看 url 模式):

    views.py

    def newplayer(request):
        # You might have to change some of the parameters in the form object below.
        # Example: I know if you made your own validation instead of django's,
        # object.photo = request.FILES.get('uploadphoto', False) would get the picture fine,
        # but I'm not sure about django forms.
        form = NewPlayerForm(request.POST or None, request.FILES)
        if request.method == 'POST' and form.is_valid():
            player = Player()
            player.pseudo = form.cleaned_data['pseudo']
            player.gender = form.cleaned_data['gender']
            player.picture = form.cleaned_data['picture']
            player.save()
            saved = 'Player has been saved!'
            return render(request, 'success.html', {'saved': saved})
        else:
            return render(request, 'create_player.html', {'form': form})
    

    template.html

    {% if saved %}
        <p>{{ saved }}</p>
    {% else %)
       <form method="post" enctype="multipart/form-data" action=".">
           {% csrf_token %}
           {{ form.as_p }}
           <input type="submit" value="submit" />
       </form>
    {% endif %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 2017-02-24
      • 2020-03-04
      相关资源
      最近更新 更多