这是我第一次在这里问问题:)我是一个Django的初学者,我已经被我的edit_booking方法卡住了好几天,我甚至不知道我做错了什么.
我在做一个预订系统,我得到了"TypeError at /edit-booking/6 __init__() got an unexpected keyword argument 'id'"
分.我一直在try 很多事情,使编辑准确的预订可能,但他们只会导致更多的错误.
意见:
class EditBooking(DetailView):
def __init__(self):
template_name = 'edit-profile.html'
initial = {}
@login_required
def edit_booking(request, id):
booking = get_object_or_404(Booking, id=id)
if request.method == 'POST':
form = BookingForm(request.POST, instance=booking)
customer_data = UserProfile.objects.all()
if form.is_valid():
instance = form.save(commit=False)
instance.customer_data = customer_data
instance.save()
messages.success(request, 'Thank you! Your booking has been updated!')
else:
return messages.error(request, form.errors)
else:
form = BookingForm(initial={
'booking_date': booking.booking_date,
'booking_time': booking.booking_time,
'table_size': booking.table_size,
'additional_info': booking.additional_info,
})
return render(request, template_name, {'form': form})
以下模板可用:
触发编辑页面的Profile.html按钮:
<a href="{% url 'editbooking' id=booking.id %}" aria-label="edit booking">
<button type="button" class="btn btn-secondary btn-brown px-5">Edit</button>
</a>
EDIT_Booking.html:
<form method="POST" action="{% url 'editbooking' id=booking.id %}"
class="col-6">
{% csrf_token %}
{% crispy form %}
</form>
URL:
path('edit-booking/<int:id>', views.EditBooking, name='editbooking'),
型号:
class Booking(models.Model):
booking_customer = models.ForeignKey(UserProfile, on_delete=models.CASCADE, null=True)
booking_date = models.DateField(default=datetime.date.today)
booking_time = models.CharField(choices=TIME_SLOTS, default='8:00 - 8:30', max_length=50)
table_size = models.CharField(choices=TABLE_SIZE, default='1', max_length=50)
additional_info = models.TextField(max_length=400, null=True, blank=True)
booked_on = models.DateTimeField(auto_now_add=True)
is_confirmed = models.CharField(choices=CONFIRMATION, default='Awaiting confirmation', max_length=50)
slug = AutoSlugField(max_length=70, unique=True, null=True)
class Meta:
ordering = ["booked_on"]
def __str__(self):
return f'Booking for {self.booking_date} at {self.booking_time} was booked on {self.booked_on} and currently has a status: {self.is_confirmed}'
表格:
class BookingForm(ModelForm):
"""
Provides necessary fields to the booking form for customers
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Crispy form helpers
self.helper = FormHelper()
self.helper.form_method = 'post'
self.helper.add_input(Submit('submit', 'Submit', css_class='btn btn-secondary btn-brown mb-4 mx-auto px-5'))
# Provides a date widget to the form
booking_date = forms.DateField(widget=forms.DateInput(attrs={'class':'form-control', 'type':'date', 'value': datetime.date.today}), required=False)
booking_time = forms.ChoiceField(choices=TIME_SLOTS, required=False)
table_size = forms.ChoiceField(choices=TABLE_SIZE, required=False)
additional_info = forms.CharField(max_length=400, widget=SummernoteWidget(), required=False)
booked_on = forms.DateTimeField(initial=datetime.datetime.now, widget=forms.HiddenInput(), required = False)
slug = AutoSlugField(max_length=70, unique=True, populate_from=lambda instance: instance.title,
unique_with=['booked_on', 'booking_date'],
slugify=lambda value: value.replace(' ','-'))
# Provides a model to pull the fields from
class Meta:
model = Booking
fields = ['booking_date', 'booking_time', 'table_size', 'additional_info']
read_only = ['booked_on', 'slug']
# Prevents booking dates in the past
def save_booking(self, *args, **kwargs):
data = self.cleaned_data
if data.get('booking_date') < datetime.date.today():
raise ValidationError("The date cannot be in the past!")
else:
super(Booking, self).save(*args, **kwargs)
我试图使用slug、pk和id来获得准确的预订,我更改了URL和模板以显示id,使用Booking.objects.get()并在最后将其与Get_Object_or_404交换,摆脱init等……我在这里一直在寻找类似的问题,但我try 的解决方案都没有真正对我起作用: