【问题标题】:Django form doesn't send dataDjango 表单不发送数据
【发布时间】:2021-02-22 22:21:56
【问题描述】:

我正在尝试将用户添加到日历中的某些事件(使用 fullcalendar),但是当放置表单以向用户请求数据时,此表单不会向我发送数据。如何获取它应该发送的数据?

这是我的 event_register.html:

<div class="col-xl-6">
    <p>Apuntarse como invitado.</p>
    <form  action="" method="POST"> 
        {% csrf_token %}
        <div class="form-group">
            <label for="first_name">Nombre:</label> 
            <!--<input id="first_name" name="first_name" placeholder="Nombre del participante" type="text" required="required" class="form-control">-->
            <div class="input-group">
                {{form.first_name}}
            </div>
        </div>
        <div class="form-group">
            <label for="last_name">Apellidos:</label> 
            <!--<input id="last_name" name="last_name" placeholder="Apellidos del participante" type="text" required="required" class="form-control">-->
            <div class="input-group">
                {{form.last_name}}
            </div>
        </div>
        <div class="form-group">
            <label for="phone">Teléfono:</label> 
            <!--<input id="phone" name="phone" placeholder="Teléfono del participante" type="text" required="required" class="form-control">-->
            <div class="input-group">
                {{form.phone}}
            </div>
        </div>
        <div class="form-group">
            <label for="email">Correo electrónico:</label> 
            <!--<input id="email" name="email" placeholder="Correo electrónico del participante" type="text" required="required" class="form-control">-->
            <div class="input-group">
                {{form.email}}
            </div>
        </div> 
        <div class="form-group">
            <input type="submit" class="btn btn-primary btn-block py-2" value="Enviar">
        </div>
    </form>
</div>

<div class="col-xl-6">

</div>

这是我的观点.py:

def attend_to(request):

event_form = EventForm()
print('Hola')

if request.method == 'POST':
    event_form = EventForm(data=request.POST)
    if event_form.is_valid():
        Assistant.objects.create(UserManegement=None, Event=request.event_id, frist_name=request.POST["first_name"], last_name=request.POST["last_name"], phone=request.POST["phone"], email=request.POST["email"])
        return render(request, "core/home.html")
else:
    Assistant.objects.create(UserManegement=request.POST["user"], Event=request.POST["event"])
    return render( "core/home.html")

这是我的forms.py:

from django import forms

class EventForm(forms.Form):
first_name = forms.CharField(label="first_name", required=True, widget=forms.TextInput(
    attrs={'class':'form-control', 'placeholder':'Escribe tu nombre'}
), min_length=3, max_length=100)
last_name = forms.CharField(label="last_name", required=True, widget=forms.TextInput(
    attrs={'class':'form-control', 'placeholder':'Apellidos'}
), min_length=3, max_length=100)
phone = forms.CharField(label="phone", required=True, widget=forms.TextInput(
    attrs={'class':'form-control', 'placeholder':'Telefono'}
), min_length=9, max_length=9)
email = forms.EmailField(label="Email", required=True,  widget=forms.EmailInput(
    attrs={'class':'form-control', 'placeholder':'Escribe tu email'}
), min_length=3, max_length=100)

这是我的 urls.py:

urlpatterns = [
path('', views.attend_to, name='attend_to'),

]

这是我点击按钮时收到的信息:

"POST /event/1/ HTTP/1.1" 200 6249

这是呈现 event_register.html 视图的视图,我有一个带有 fullcalendar 的日历,当点击一个事件时它会显示该模板。

def register_event(request, event_id):
event = get_object_or_404(Event, id=event_id)
return render(request, "events/event_register.html", {'event':event})

提前致谢。

编辑 1: 我不知道现在是什么问题,但是当我点击事件打开包含表单的 url 时,它并没有显示相应的模板。好像没有进入 if request.method == 'POST'。在这里我留下更新的代码。

渲染模板 event_register.html 的视图:

def register_event(request, event_id):
event_form = EventForm()
event = get_object_or_404(Event, id=event_id)
return render(request, "events/event_register.html", {'event':event, 
'form':event_form})

包含表单的模板:

<form  action="{% url 'attend_to' %}" method="POST"> 
        {% csrf_token %}
        <div class="form-group">
            <label for="first_name">Nombre:</label> 
            <!--<input id="first_name" name="first_name" placeholder="Nombre del participante" type="text" required="required" class="form-control">-->
            <div class="input-group">
                {{form.frist_name}}
            </div>
        </div>

urls.py 核心加载模板:

urlpatterns = [
#Path del core
path('', views.home, name='home'),
path('about/', views.about, name='about'),
path('event/<int:event_id>/', include('events.urls'), name='attend_to'),

]

用于事件的 urls.py:

urlpatterns = [
path('', views.attend_to, name='attend_to'),

]

包含attend_to 的views.py,它显示了print('Hola'):

def attend_to(request, event_id):

event_form = EventForm()
print('Hola')

if request.method == 'POST':
    event_form = EventForm(request.POST)
    if event_form.is_valid():
        event_form.save()
        context = {"form":event_form}
        Assistant.objects.create(UserManegement=None, Event=request.event_id, frist_name=context.first_name, last_name=context.last_name, phone=context.phone, email=context.email)
        
        #Assistant.objects.create(UserManegement=None, Event=request.event_id, frist_name=request.POST["first_name"], last_name=request.POST["last_name"], phone=request.POST["phone"], email=request.POST["email"])
        #return render(request, "core/home.html")
        return HttpResponseRedirect('/')

        #return render("core/home.html", context)
#else:
#    Assistant.objects.create(UserManegement=request.POST["user"], Event=request.POST["event"])
#    return render( "core/home.html")
else:
    event_form = EventForm()
return render(request, 'core/home.html', {'form': event_form})

显示服务器的响应:

[24/Feb/2021 10:27:05] "GET / HTTP/1.1" 200 9404
Hola

【问题讨论】:

  • 是在提交表单时表单无效还是在模板中根本看不到表单域?
  • @Danoram 如果我取消注释 html 表单的字段,这些字段会出现,但我无法让它发送任何内容。如果我将表单字段与 {form.first_name} 放在一起,则字段不会出现。
  • 这些字段没有与{form.first_name} 一起出现,因为您没有将表单放在视图的上下文中。至少,不是来自您提供的代码。这导致了下一个问题,即 html 表单位于名为 event_register.html 的模板中,但您提供的视图函数不呈现此视图?能否提供渲染event_register.html的视图函数代码
  • 我刚刚编辑以显示视图。 @Danoram

标签: python html django


【解决方案1】:

使用 Model Form 代替 form.Forms

class EventForm(forms.ModelForm):
    class Meta:
        model = In which You want to save data
        fields = "__all__" If you want to select all fields from your model or you can specify the list of fields in a list or tuple
        fields = ("field1","Field2","field3")

此表单会自动将您的所有模型字段映射到 HTML 只需在 HTML 中呈现此表单。在 View 中您也不需要编写这么多代码

def attend_to(request):
    event_form = EventForm()
    if request.method == 'POST':
       event_form = EventForm(request.POST)
       if event_form.is_valid():
           event_form.save()
           return redirect()#After Form submission use redirect.Never use render as it can create duplicate enteries on refresh.
    context = {"form":event_form}#Passing the form in HTML
    return render( "core/home.html",context)

HTML

 {% csrf_token %}
    <div class="form-group">
        <label for="first_name">Nombre:</label> 
        {{form.fieldname}}
        <div class="input-group">
            {{form.first_name}}
        </div>
    </div>
    <div class="form-group">
        <label for="last_name">Apellidos:</label> 
        <!--<input id="last_name" name="last_name" placeholder="Apellidos del participante" type="text" required="required" class="form-control">-->
        <div class="input-group">
            {{form.last_name}}
        </div>
    </div>
    <div class="form-group">
        <label for="phone">Teléfono:</label> 
        <!--<input id="phone" name="phone" placeholder="Teléfono del participante" type="text" required="required" class="form-control">-->
        <div class="input-group">
            {{form.phone}}
        </div>
    </div>
    <div class="form-group">
        <label for="email">Correo electrónico:</label> 
        <!--<input id="email" name="email" placeholder="Correo electrónico del participante" type="text" required="required" class="form-control">-->
        <div class="input-group">
            {{form.email}}
        </div>
    </div> 
    <div class="form-group">
        <input type="submit" class="btn btn-primary btn-block py-2" value="Enviar">
    </div>
</form>

您可以使用 load_widget_tweaks 来设置表单样式,而不是在表单中编写代码

【讨论】:

  • 你放的我已经做了,表格的字段没有出现。取消注释 html 的标签以使字段显示无效,我无法发送任何内容。
【解决方案2】:

register_event视图函数中添加空白表单。

def register_event(request, event_id):
    event_form = EventForm()
    event = get_object_or_404(Event, id=event_id)
    return render(request, "events/event_register.html", {'event':event, 'form': event_form})

这将确保表单字段显示在您可以提交的event_register.html 视图中。

然后在你的表单html中,更改action属性,将表单数据提交给attend_to视图函数。

从这里

<form  action="" method="POST">

到这里

<form  action="{% url 'attend_to' %}" method="POST">

【讨论】:

  • 好了,现在您可以看到表单的字段了。现在,发送表单时,它不执行视图的attend_to 功能。你知道为什么会这样吗?
  • 我将编辑我的答案以解决该问题
  • 这样做之后,它似乎工作,但它没有。我已将更新后的代码放在带有编辑 1 的初始帖子中。
  • 澄清一下,event_register.html 模板现在没有渲染?您能否在 urls.py 中包含所有路径
  • 在编辑 1 中添加了核心和事件的完整 url。是的,它没有向我显示包含表单的模板 event_register,但在视图函数中它在其他方面跨度>
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2020-11-12
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多