Django:使用一个html表单将信息发布到多个模型
我现在正在建立我的第一个单独的django项目,所以我学到了很多。我遇到了一个我想不出如何解决的问题。对于一个梦幻足球应用程序项目,我用他们自己的模型表示了每种类型的球员位置。像这样Django:使用一个html表单将信息发布到多个模型,django,post,django-models,django-forms,django-templates,Django,Post,Django Models,Django Forms,Django Templates,我现在正在建立我的第一个单独的django项目,所以我学到了很多。我遇到了一个我想不出如何解决的问题。对于一个梦幻足球应用程序项目,我用他们自己的模型表示了每种类型的球员位置。像这样 class Quarterback(models.Model): name = models.CharField(max_length=20) class Runningback(models.Model): name = models.CharField(max_lengt
class Quarterback(models.Model):
name = models.CharField(max_length=20)
class Runningback(models.Model):
name = models.CharField(max_length=20)
class Widereceiver(models.Model):
name = models.CharField(max_length=20)
class Tightend(models.Model):
name = models.CharField(max_length=20)
class Kicker(models.Model):
name = models.CharField(max_length=20)
我有一个“选择玩家”页面,它使用javascript来填写我为每个玩家模型制作的模型表单。这是我的表格
class Quarterbackform(forms.ModelForm):
class Meta:
model = Quarterback
fields = "__all__"
widgets = {
'name': forms.TextInput(attrs={'id':'QB_name'})
}
class Runningbackform(forms.ModelForm):
class Meta:
model = Runningback
fields = "__all__"
widgets = {
'name': forms.TextInput(attrs={'id':'RB_name'})
}
class Widereceiverform(forms.ModelForm):
class Meta:
model = Widereceiver
fields = "__all__"
widgets = {
'name': forms.TextInput(attrs={'id':'WR_name'})
}
class Tightendform(forms.ModelForm):
class Meta:
model = Tightend
fields = "__all__"
widgets = {
'name': forms.TextInput(attrs={'id':'TE_name'})
}
class Kickerform(forms.ModelForm):
class Meta:
model = Kicker
fields = "__all__"
widgets = {
'name': forms.TextInput(attrs={'id':'K_name'})
}
My views.py具有将玩家选择保存到其各自型号的功能
def emp(request):
url = 'hidden'
r = requests.get(url.format()).json()
player_data = []
#print(r)
for i in r:
player_info = {
'player_id' : i['PlayerID'],
'player_name' : i['Name'],
'team' : i['Team'],
'position': i['Position'],
'points': i['FantasyPoints']
}
player_data.append(player_info)
#print(player_data)
if request.method == "POST":
QBform = Quarterbackform(request.POST)
if QBform.is_valid():
try:
QBform.save()
return redirect('show')
except:
pass
else:
QBform = Quarterbackform()
# New Player/Form
if request.method == "POST":
RBform = Runningbackform(request.POST)
if RBform.is_valid():
try:
RBform.save()
return redirect('show')
except:
pass
else:
RBform = Runningbackform()
# New Player/Form
if request.method == "POST":
WRform = Widereceiverform(request.POST)
if WRform.is_valid():
try:
WRform.save()
return redirect('show')
except:
pass
else:
WRform = Widereceiverform()
# New Player/Form
if request.method == "POST":
TEform = Tightendform(request.POST)
if TEform.is_valid():
try:
form.save()
return redirect('show')
except:
pass
else:
TEform = Tightendform()
# New Player/Form
if request.method == "POST":
Kform = Kickerform(request.POST)
if Kform.is_valid():
try:
Kform.save()
return redirect('show')
except:
pass
else:
Kform = Kickerform()
context = {'player_data': player_data,
'QBform': QBform,
'RBform': RBform,
'WRform': WRform,
'TEform': TEform,
'Kform': Kform
}
return render(request,'game/form.html', context)
我还使用这个函数来显示/渲染选定的玩家
def show(request):
user = request.user
if user.is_authenticated:
try:
QB = Quarterback.objects.values_list('name', flat="True")[0]
except IndexError:
QB = 'empty'
try:
RB = Runningback.objects.values_list('name', flat="True")[0]
except IndexError:
RB = 'empty'
try:
WR = Widereceiver.objects.values_list('name', flat="True")[0]
except IndexError:
WR = 'empty'
try:
TE = Tightend.objects.values_list('name', flat="True")[0]
except IndexError:
TE = 'empty'
try:
K = Kicker.objects.values_list('name', flat="True")[0]
except IndexError:
K = 'empty'
context = {
'QB': QB[0:],
'RB': RB[0:],
'WR': WR[0:],
'TE': TE[0:],
'K': K[0:]
}
return render(request,"game/show.html", context)
这是用于选择玩家的html页面。如您所见,每个表单输入区域都由一个javascript onclick函数填充
{% extends "game/layout.html" %}
{% load static %}
{% block body %}
<form method="POST" class="post-form" action="/game/emp">
{% csrf_token %}
<div class="container">
<br>
<div class="form-group row">
<label class="col-sm-1 col-form-label"></label>
<div class="col-sm-4">
<h3>Enter Details</h3>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label">Quarterback:</label>
<div class="col-sm-4">
{{ QBform }}
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label">Running Back:</label>
<div class="col-sm-4">
{{ RBform }}
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label">Wide Receiver:</label>
<div class="col-sm-4">
{{ WRform }}
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label">Tight End:</label>
<div class="col-sm-4">
{{ TEform }}
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label">Kicker:</label>
<div class="col-sm-4">
{{ Kform }}
</div>
</div>
<div class="form-group row">
<label class="col-sm-1 col-form-label"></label>
<div class="col-sm-4">
<button type="submit" value="Submit" class="btn btn-primary">Submit</button>
</div>
</div>
</div>
</form>
<br>
<br>
<br>
<script>
function myFunction(txt) {
var myTxt = txt;
if (txt.includes('QB')) {
document.getElementById("QB_name").value = myTxt;
}
else if (txt.includes('RB')) {
document.getElementById("RB_name").value = myTxt;
}
else if (txt.includes('WR')) {
document.getElementById("WR_name").value = myTxt;
}
else if (txt.includes('TE')) {
document.getElementById("TE_name").value = myTxt;
}
else if (txt.includes('K')) {
document.getElementById("K_name").value = myTxt;
}
}
</script>
{% for player_data in player_data %}
<li><p>Player ID: {{ player_data.player_id }}: {{ player_data.player_name }}, {{ player_data.team }}, {{ player_data.position }}, {{ player_data.points }}</p></li> <button onclick="myFunction('{{ player_data.player_name }} {{ player_data.position }} {{ player_data.points }}')">Add</button>
{% endfor %}
{% endblock %}
{%extends“game/layout.html”%}
{%load static%}
{%block body%}
{%csrf_令牌%}
输入详细信息
四分卫:
{{QBform}}
返回:
{{RBform}}
宽接收机:
{{WRform}}
紧端:
{{TEform}}
踢球者:
{{Kform}}
提交
函数myFunction(txt){
var myTxt=txt;
if(txt.includes('QB')){
document.getElementById(“QB_名称”).value=myTxt;
}
else if(txt.includes('RB')){
document.getElementById(“RB_name”).value=myTxt;
}
else if(txt.includes('WR')){
document.getElementById(“WR_name”).value=myTxt;
}
else if(txt.includes('TE')){
document.getElementById(“TE_name”).value=myTxt;
}
else if(txt.includes('K')){
document.getElementById(“K_name”).value=myTxt;
}
}
{player_data%}中的player_数据为%
球员ID:{{Player_data.Player_ID}}:{{Player_data.Player_name}、{{Player_data.team}、{{Player_data.position}、{{Player_data.points} 添加
{%endfor%}
{%endblock%}
我遇到的问题是,实际上只有一个对象被保存。在这种情况下,它只是保存踢球者对象,并且出于某种奇怪的原因将其保存在四分卫模型中。我怀疑这是因为表单及其提交按钮只能向一个表单发送post请求。如果是这种情况,是否可以只需单击/提交一次即可保存所有5个对象?到目前为止,这是关于为什么只有一个对象正确保存的唯一理论。如果有任何建议,我将不胜感激。感谢您的关注。您不必创建多个
模型表单。您可以创建一个常规的,保留其中所有模型的字段
例如:
class MyForm(forms.Form):
quarterback_name = forms.CharField(label='Quarterback', max_length=100)
runningback_name = forms.CharField(label='Runningback', max_length=100)
# Add other fields ...
def save(self):
# Here you can update the corresponding models
quarterback_name = self.cleaned_data.get('quarterback_name')
Quarterback.objects.create(name=quarterback_name)
# ... same for other models ...
注意:您可以创建一个名为player
的模型,然后设置每个玩家的角色,而不是为每种类型的玩家创建单独的模型:
class播放器(models.Model):
玩家角色选择=(
(1,“四分卫”),
(2,'减速'),
(3,“结束”),
#等等
)
角色=模型。积极的Allintegerfield(选项=玩家角色选项)
请阅读更多信息。谢谢你的提示。最初,我确实是从一个模型开始的,该模型用于整个球队的球员/位置名册和一个表格,但我无法使其正确渲染。不过,我的模型中没有类似“def save”的功能。我猜它取代了视图功能来保存和更新相应的模型?@user14593966是的,save
方法有助于保存/编辑表单中的逻辑,而不是视图中的逻辑。