Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:使用一个html表单将信息发布到多个模型_Django_Post_Django Models_Django Forms_Django Templates - Fatal编程技术网

Django:使用一个html表单将信息发布到多个模型

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

我现在正在建立我的第一个单独的django项目,所以我学到了很多。我遇到了一个我想不出如何解决的问题。对于一个梦幻足球应用程序项目,我用他们自己的模型表示了每种类型的球员位置。像这样


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
    方法有助于保存/编辑表单中的逻辑,而不是视图中的逻辑。