Python 3.8 django log 10 - Add form and user interaction
Flow
from django.shortcuts import render, get_object_or_404
from .models import Meeting, Room
def detail(request, id):
meeting = get_object_or_404(Meeting, pk=id)
return render(request, "meetings/detail.html", {"meeting": meeting})
def rooms_list(request):
return render(request, "meetings/rooms_list.html",
{"rooms": Room.objects.all()})
def new(request):
return render(request, "meetings/new.html")
2. Add new.html under meetings
{% extends "base.html" %}
{% block tiile %}New Meeting{% endblock %}
{% block content %}
<h1>Plan an new meeting</h1>
<form>
<table>
{{ form }}
</table>
</form>
{% endblock %}3. Edit views.py
from django.shortcuts import render, get_object_or_404
from django.forms import modelform_factory
from .models import Meeting, Room
def detail(request, id):
meeting = get_object_or_404(Meeting, pk=id)
return render(request, "meetings/detail.html", {"meeting": meeting})
def rooms_list(request):
return render(request, "meetings/rooms_list.html",
{"rooms": Room.objects.all()})
MeetingForm = modelform_factory(Meeting, exclude=[])
def new(request):
form = MeetingForm()
return render(request, "meetings/new.html", {"form": form})
4. urls.py
from django.urls import path
from .import views
urlpatterns = [
path('<int:id>', views.detail, name="detail"),
path('rooms', views.rooms_list, name="rooms"),
path('new', views.new, name="new")
]
5. Create submit button
{% extends "base.html" %}
{% block tiile %}New Meeting{% endblock %}
{% block content %}
<h1>Plan an new meeting</h1>
<form>
<table>
{{ form }}
</table>
{% csrf_token %}
<button type="submit">Create</button>
</form>
{% endblock %}6.Change to POST
new.html
{% extends "base.html" %}
{% block tiile %}New Meeting{% endblock %}
{% block content %}
<h1>Plan an new meeting</h1>
<form method="post" >
<table>
{{ form }}
</table>
{% csrf_token %}
<button type="submit">Create</button>
</form>
{% endblock %}views.py
from django.shortcuts import render, get_object_or_404, redirect
from django.forms import modelform_factory
from .models import Meeting, Room
def detail(request, id):
meeting = get_object_or_404(Meeting, pk=id)
return render(request, "meetings/detail.html", {"meeting": meeting})
def rooms_list(request):
return render(request, "meetings/rooms_list.html",
{"rooms": Room.objects.all()})
MeetingForm = modelform_factory(Meeting, exclude=[])
def new(request):
if request.method == "POST":
form = MeetingForm(request.POST)
if form.is_valid():
form.save()
return redirect("welcome")
else:
form = MeetingForm()
return render(request, "meetings/new.html", {"form": form})
7. Add forms.py
forms.py
from datetime import date
from django.forms import ModelForm, DateInput, TimeInput, TextInput, IntegerField
from django.core.exceptions import ValidationError
from .models import Meeting
class MeetingForm(ModelForm):
class Meta:
model = Meeting
fields = "__all__"
widgets = {
'date': DateInput(attrs={"type":"date"}),
'start': TimeInput(attrs={"type":"time"}),
'duration': TextInput(attrs={"type":"number", "min":"1", "max":"4"})
}
def clean_data(self):
d = self.cleaned_data.get("date")
if d < date.today():
raise ValidationError("Meeting cannot be in the past")
return d
views.py
from datetime import date
from django.forms import ModelForm, DateInput, TimeInput, TextInput, IntegerField
from django.core.exceptions import ValidationError
from .models import Meeting
class MeetingForm(ModelForm):
class Meta:
model = Meeting
fields = "__all__"
widgets = {
'date': DateInput(attrs={"type":"date"}),
'start': TimeInput(attrs={"type":"time"}),
'duration': TextInput(attrs={"type":"number", "min":"1", "max":"4"})
}
def clean_data(self):
d = self.clean_data.get("date")
if d < date.today():
raise ValidationError("Meeting cannot be in the past")
return d
new.html
{% extends "base.html" %}
{% block tiile %}New Meeting{% endblock %}
{% block content %}
<h1>Plan an new meeting</h1>
<form method="post" >
<table>
{{ form }}
</table>
{% csrf_token %}
<button type="submit">Create</button>
</form>
{% endblock %}8. Check web site

留言
張貼留言