尝试在Django中编辑特定对象时,不存在匹配查询

时间:2018-03-20 11:24:11

标签: django django-models django-forms django-views

我创建了一个应用程序,用户可以在其中进行预订对象中存储的预订。在每个预订中都有一个自动生成的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视图以编辑您的预订。这是我收到错误的时候。任何人都可以帮助我吗?

全部谢谢!

2 个答案:

答案 0 :(得分:0)

"匹配查询不存在" 这通常在您尝试访问不存在的对象时出现。在你的情况下,我认为unique_id是None,因此没有像

这样的查询
Booking.objects.get(unique_id=None)

请调试它,确保它不是无,并进行一些异常处理。

答案 1 :(得分:0)

您并未在网址中包含uuid。这意味着视图中的unique_idNone,因此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,因为您不希望它可以编辑。