Je crée un site web qui montre des événements en utilisant un ListView et chaque événement a un formulaire d'inscription.Django - Le formulaire ne sauvegarde pas
Les erreurs de validation de formulaire s'affichent toutes, mais après la soumission réussie du formulaire, cela m'amène simplement à la page de réussite et le formulaire n'est pas enregistré dans la base de données.
Quand je soumets le formulaire par admin et non la forme, il me donne une erreur: NameError à/admin/home/inscriptions/ajouter/ nom global « fullname » est pas défini avec retraçage à: instance.fullname = nom complet dans forms.py.
Une autre erreur si je supprimer complètement cette ligne est: NameError à/admin/home/signups/ajouter/ nom global 'demande' est pas définie avec retraçage à instance.ip = get_ip (demande) forms.py .
forms.py:
from django import forms
from .models import SignUps, Hours, Events
import datetime
from ipware.ip import get_ip
class SignUpForm(forms.ModelForm):
fullname = forms.CharField(label="Full name", widget=forms.TextInput(attrs={'placeholder': 'Full name', 'class': 'form-control'}))
class Meta:
model = SignUps
fields = ['eventname','fullname','ip']
def clean_fullname(self):
fullname = self.cleaned_data.get('fullname').title()
eventname = self.cleaned_data.get('eventname')
try:
name = Hours.objects.get(fullname=fullname)
except Hours.DoesNotExist:
raise forms.ValidationError("Please enter a valid Key Club member's full name as displayed in the hours page.")
try:
name = SignUps.objects.get(fullname=fullname)
except SignUps.DoesNotExist:
try:
numOfSignUps = SignUps.objects.filter(eventname=eventname).count()
except SignUps.DoesNotExist:
numOfSignUps = 0
try:
event = Events.objects.get(name=eventname)
except Events.DoesNotExist:
raise forms.ValidationError("Something went wrong. This event does not exist.")
try:
ifFull = Events.objects.filter(name=eventname).get(maximum__gt=numOfSignUps)
except Events.DoesNotExist:
raise forms.ValidationError("The maximum number of attendees has already been reached.")
try:
date = Events.objects.filter(name=eventname).get(date=datetime.date.today())
except Events.DoesNotExist:
return fullname
raise forms.ValidationError("It is too late to sign up for this event.")
raise forms.ValidationError("This member is already signed up.")
def save(self, commit=True):
instance = super(SignUpForm, self).save(commit=False)
instance.fullname = fullname
instance.ip = get_ip(request)
if commit:
instance.save()
return instance
événements/index.html corps principal:
<div class="container" style="margin-top:75px;">
{% block content %}
{% for announcements in announcement %}
<div class="alert alert-info" role="alert">
<h4 class="alert-heading">{{ announcements.announcementname }}</h4>
<p style="margin:0 0;">{{ announcements.announcement | safe | linebreaksbr | urlize }}</p>
</div>
{% endfor %}
{% for events in events_list %}
<div id="checkIn" class="modal fade">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title">OCC Check-Ins</h4>
</div>
<div class="modal-body">
<form method="POST">
<div class="form-group">
<input type="password" class="form-control" id="passcode" placeholder="Passcode" maxlength="4" autocomplete="off">
</div>
<div class="form-group"><button type="submit" class="btn btn-primary btn-block">Sign in</button></div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<div class="card card-block col-sm-6" style="display:inline-block;">
<div class="dropdown" style="float:right;">
<a href="#" style="color:black;" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><h5><i class="fa fa-caret-down" aria-hidden="true"></i></h5></a>
<div class="dropdown-menu dropdown-menu-left" aria-labelledby="dropdownMenuButton" style="right:0;left:auto;">
<a class="dropdown-item" href="#">View</a>
</div>
</div>
<h4 class="card-title">{{ events.name }}</h4>
<p class="card-text">Description: <span class="text-muted">{{ events.description }}</span><br>Where: <a href="https://www.google.com/maps/place/{{ events.location }}" class="text-muted">{{ events.location }}</a><br>When: <span class="text-muted">{{ events.date|date:"D, M d, Y" }}</span><br>Time: <span class="text-muted">{{ events.time|time:"P" }}</span><br>Max: <span class="text-muted">{{ events.maximum }}</span><br>Hours: <span class="text-muted">{{ events.hours }}</span><br>Check in with: <span class="text-muted">{{ events.occ }}</span></p>
<h4 class="card-text" style="margin-top:-6px;margin-bottom:8px;"><a href="#" style="color:black; text-decoration:none;" data-toggle="modal" data-target="#checkIn"><i class="fa fa-sign-in" aria-hidden="true" style="margin-bottom:10px;"></i> OCC Check-Ins</a></h4>
<form action="/events/" class="form" method="POST">{% csrf_token %}
<div class="form-group">
<input id="id_eventname" maxlength="125" name="eventname" type="hidden" value="{{ events.name }}">
{{ form.fullname }}
{{ form.fullname.errors }}
</div>
<button class="btn btn-primary btn-block" type="submit">Sign up</button>
</form>
</div>
{% endfor %}
{% endblock %}
</div>
success.html est juste une page HTML vide qui dit "succès":
<div class="container" style="margin-top:75px;">
Success
</div>
views.py:
from django.shortcuts import render
from django.views.generic import ListView, FormView
from django.views.generic.detail import SingleObjectMixin
from home.models import Events, Announcement, Hours, SignUps
from django import forms
from .forms import SignUpForm
from django.http import HttpResponseForbidden
from django.urls import reverse
from django.views import View
from ipware.ip import get_ip
from django.views.generic.edit import FormView
# Create your views here.
def index(request):
return render(request, 'home/index.html')
def about(request):
return render(request, 'about/index.html')
def success(request):
return render(request, 'events/success.html')
class EventsDisplay(ListView, FormView):
template_name='events/index.html'
context_object_name = "events_list"
queryset = Events.objects.all().order_by("date")
form_class = SignUpForm
success_url = "/events/success"
def get_context_data(self, **kwargs):
self.object_list = self.get_queryset()
context = super(EventsDisplay, self).get_context_data(**kwargs)
context['announcement'] = Announcement.objects.all().order_by("-datetime")
context['signup'] = SignUps.objects.all().order_by("fullname")
return context
class HoursList(ListView):
template_name = 'hours/index.html'
context_object_name = "hours_list"
queryset = Hours.objects.all().order_by("fullname")
def get_context_data(self, **kwargs):
context = super(HoursList, self).get_context_data(**kwargs)
context['announcement'] = Announcement.objects.all().order_by("-datetime")
return context
urls.py:
from django.conf.urls import url, include
from views import EventsDisplay, HoursList
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^events/$', EventsDisplay.as_view()),
url(r'^events/success$', views.success, name='success'),
url(r'^hours/$', HoursList.as_view()),
url(r'^about/$', views.about, name='about'),
]
Lorsque je soumets le formulaire, il me donne une erreur: AttributeError at/events/ L'objet 'EventsDisplay' n'a pas d'attribut 'object_list'. Traceback va à: context = super (EventsDisplay, self) .get_context_data (** kwargs) dans views.py –
Au lieu d'utiliser 'object_list' dans votre code html, utilisez maintenant' events_list'. Le 'context_object_name' vous permet d'utiliser un nom plus spécifique dans les templates plutôt que d'utiliser un nom général et sans signification comme' object_list'. –
La même erreur se produit toujours. –