我创建了一个应用程序,用户可以在其中进行预订对象中存储的预订。在每个预订中都有一个自动生成的UUID随机生成的代码。
我正在创建编辑视图,为了做到这一点,我需要按照unique_id过滤视图。当我这样做时,我收到错误“预订匹配查询不存在”。请在下面找到代码。
views.py
def addstudents(request, unique_id=None):
booking = Booking.objects.get(unique_id=unique_id)
if (request.method == 'POST'):
form = BookingForm(data=request.POST, instance=booking)
if form.is_valid():
form.save(commit=True)
return redirect('teachers:upcoming')
else:
booking_dict = model_to_dict(booking)
form = BookingForm(booking_dict)
return render(request, 'teachers:studentadd')
models.py
class Booking(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
unique_id = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
coursename = models.CharField(max_length=200)
daterequired = models.DateTimeField(default=datetime.now(timezone.utc))
students = models.CharField(max_length=200)
length = models.IntegerField()
matches = models.ManyToManyField(Student, related_name='matches')
slug = models.SlugField(max_length=40, blank=True)
def save(self, *args, **kwargs):
if not self.pk:
self.slug = slugify(self.coursename)
super(Booking, self).save(*args, **kwargs)
def __str__(self):
return str(self.user.username)
forms.py
class BookingForm(forms.ModelForm):
class Meta:
model = Booking
exclude = ['user', ]
widgets = {
'students': forms.TextInput(attrs={'placeholder': 'Number of Students'}),
'length': forms.TextInput(
attrs={'placeholder': 'Time needed in hours'}),
'coursename': forms.TextInput(
attrs={'placeholder': 'Name of your course for students'}),
}
labels = {
'daterequired': 'What date and time do you require?',
'coursename': 'Name of Upcoming Course'
}
urls.py
path('teachers/', include(([
path('', teachers.QuizListView.as_view(), name='quiz_change_list'),
path('choose/', teachers.choose, name='choose'),
path('book/', teachers.book, name='book'),
path('addstudents/', teachers.addstudents, name='studentadd'),
path('upcoming/', teachers.upcoming, name='upcoming'),
], 'classroom'), namespace='teachers')),
]
基本上在即将到来的视图中,您将看到即将到来的预订列表。您可以点击添加学生,这将带您进入addstudents视图以编辑您的预订。这是我收到错误的时候。任何人都可以帮助我吗?
全部谢谢!
答案 0 :(得分:0)
"匹配查询不存在" 这通常在您尝试访问不存在的对象时出现。在你的情况下,我认为unique_id是None,因此没有像
这样的查询Booking.objects.get(unique_id=None)
请调试它,确保它不是无,并进行一些异常处理。
答案 1 :(得分:0)
您并未在网址中包含uuid。这意味着视图中的unique_id
为None
,因此Booking.objects.get(unique_id=unique_id
无法正常工作。
您可以使用以下网址将unique_id
uuid添加到网址
path('addstudents/<uuid:unique_id>/', teachers.addstudents, name='studentadd'),
有关详细信息,请参阅URL dispatcher上的文档。
由于视图中需要unique_id
,我会删除=None
默认值。我还会使用get_object_or_404
快捷方式,以便在预订不存在时不会出现服务器错误。
from django.shortcuts import get_object_or_404
def addstudents(request, unique_id):
booking = get_object_or_404(Booking, unique_id=unique_id)
...
您还应该从unique_id
的字段中排除BookingForm
,因为您不希望它可以编辑。