首页 > 解决方案 > 字段“id”需要一个数字,但当我尝试创建课程时得到“完整的 JavaScript”,我收到此错误

问题描述

这是我的课程模型。

class Course(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL,\
         related_name='courses_created', on_delete=models.CASCADE)
    subject = models.ForeignKey(Subject,related_name='courses', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    pic = models.ImageField(upload_to="course_pictures")
    slug = models.SlugField(max_length=200, unique=True,blank=True)
    overview = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    enroll = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='enrollment',blank=True)

class Module(models.Model):
    course = models.ForeignKey(Course, related_name='modules', \
                        on_delete=models.CASCADE)
    title  =  models.CharField(max_length=200)
    description = models.TextField(blank=True)

    order = OrderField(blank=True, for_fields=['course'])

    class Meta:
        ordering = ['course']

class Content(models.Model):
    module = models.ForeignKey(Module,related_name='contents', on_delete=models.CASCADE)
    content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE,\
                                        limit_choices_to={'model__in':('text',
                                                        'video','image','file')})
    object_id = models.PositiveIntegerField()
    item = GenericForeignKey('content_type', 'object_id')
    order = OrderField(blank=True, for_fields=['module'])

这是我用于创建课程的函数基础视图,当我尝试发出创建课程的发布请求时,django 抛出异常 ValueError 字段“id”预期为数字但得到“完整的 JavaScript”。我想知道这个错误来自哪里,任何人都可以提供帮助。

def course_create(request,*args,**kwargs):

    id = kwargs.get('id')
    if request.method =="POST":
        subject = request.POST['title']
        course = request.POST['title']
        overview = request.POST['overview']
        front_pic = request.POST['pic']
        title = request.POST['title']
        desc = request.FILES.get('description')
        owner = Account.objects.get(username=request.user.username)
        course,create = Course.objects.get_or_create(title=course,
                                                    owner=owner,
                                                    subject=subject)
        subject,create = Subject.objects.get_or_create(title=subject)
        module,create = Module.objects.get_or_create(course=course,
                                                     description=desc,
                                                     title=title,
                                                     order=id)
        data = Course(owner=owner,
                    title=course,
                    subject=subject,
                    pic=front_pic,
                    desc=desc,
                    overview=overview,
                    order=id,
                    module=module.id)
        data.save()
        return redirect('course:main')
    return render(request,'manage/module/formset.html')

这是用于过滤和保持模型有序的 fields.py。


class OrderField(models.PositiveIntegerField):
    def __init__(self ,for_fields=None, *args, **kwargs):
        self.for_fields = for_fields
        super(OrderField, self).__init__(*args,**kwargs)
    
    def pre_save(self, model_instance, add):
        if getattr(model_instance, self.attname) is None:
            # no current value
            try:
                qs = self.model.objects.all()
                if self.for_fields:
                    #filter by objects with the same field values
                    # for the fields in for_filds
                    query ={field:getattr(model_instance, field)\
                         for field in self.for_fields}
                    qs = qs.filter(**query)
                # get the order of the last item 
                last_item = qs.latest(self.attname)
                value = last_item.order + 1
            except ObjectDoesNotExist:
                value = 0 
            setattr(model_instance, self.attname, value)
            return value 
        else:
            return super(OrderField, self).pre_save(model_instance, add)

标签: djangodjango-modelsdjango-rest-frameworkdjango-viewsdjango-templates

解决方案


推荐阅读