首页 > 解决方案 > 如何在 django 中插入带有外键字段的 modelForm 数据?

问题描述

我收到以下错误:

无法分配“'3'”:“Issue.isbn”必须是“Book”实例。

这是我的具有两个外键属性的模型:


    class Student(models.Model):
        id = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, verbose_name='ID')
        class_name = models.CharField(max_length=100)
        roll = models.CharField(max_length=100)
        section = models.CharField(max_length=100)
        shift = models.CharField(max_length=100)
        medium = models.CharField(max_length=100)
        session = models.CharField(max_length=100)
        sin = models.CharField(max_length=100)
        resident = models.CharField(max_length=100)
        hall = models.CharField(max_length=100)
        room = models.CharField(max_length=100)
    
        def __str__(self):
            return str(self.id.id)
    
        class Meta:
            managed = False
            db_table = 'student'
    
    
    @receiver(post_save, sender=User)
    def create_student(sender, instance, created, **kwargs):
        if created:
            Student.objects.create(id=instance)
        instance.student.save()
    
    
    class Book(models.Model):
        id = models.BigAutoField(primary_key=True, serialize=False, verbose_name='ID'),
        title = models.CharField(max_length=100)
        category = models.CharField(max_length=100)
        language = models.CharField(max_length=100)
        isbn = models.CharField(max_length=100, unique=True)
        author = models.CharField(max_length=100)
        publisher = models.CharField(max_length=100)
        edition = models.CharField(max_length=100)
        year = models.CharField(max_length=100)
        quantity = models.IntegerField()
        issued = models.IntegerField(null=True, blank=True)
        price = models.CharField(max_length=100)
        location = models.CharField(max_length=100)
        donated_by = models.CharField(max_length=100)
    
        def __str__(self):
            return "%s" % self.id
    
        class Meta:
            managed = False
            db_table = 'book'
    
    
    class Issue(models.Model):
        id = models.BigAutoField(primary_key=True, serialize=False, verbose_name='ID'),
        isbn = models.ForeignKey(Book, on_delete=models.CASCADE, verbose_name='isbn_id')
        student = models.ForeignKey(Student, on_delete=models.CASCADE, verbose_name='student_id')
        quantity = models.IntegerField()
        issued_date = models.DateField()
        return_date = models.DateField()
    
        # def __str__(self):
        #     return "%s" % (self.student)
    
        class Meta:
            managed = False
            db_table = 'issue'

#形式 - - - - - - - - - - - - - - - - - -

类IssueForm(forms.ModelForm):

student = forms.CharField(
    widget=forms.TextInput(
        attrs={
            "placeholder": "student",
            "class": "form-control"
        }
    ))

isbn = forms.CharField(
    widget=forms.TextInput(
        attrs={
            "placeholder": "isbn",
            "class": "form-control"
        }
    ))

quantity = forms.IntegerField(initial=1,
                              widget=forms.NumberInput(
                                  attrs={
                                      "placeholder": "quantity",
                                      "class": "form-control"
                                  }
                              ))

issue_date = forms.DateField(initial=datetime.today(),
                             disabled=True,
                             widget=forms.DateInput(
    attrs={
        'type': 'date',
        "placeholder": "issue_date",
        "class": "form-control"
    }
))

return_date = forms.DateField(
    widget=forms.DateInput(
        attrs={
            'type': 'date',
            "class": "form-control",
        }
    ))

class Meta:
    model = Issue
    fields = ('student', 'isbn',  'quantity', 'issue_date', 'return_date',)

我想插入一些数据视图 ------------------

@login_required(login_url="/login/")
def books_issue(request):
    msg = None
    success = False
    if request.method == "POST":
        form = IssueForm(request.POST or None)
        isbn = request.POST.get("isbn")
        student = request.POST.get("student")
        print(isbn, student)
        if form.is_valid():
            print("Form is valid")
            form.save()
            messages.success(request, 'Book Issued Successfully!')
            success = True
            return redirect("books_issue_list")
        else:
            msg = 'Form is not valid'
    else:
        form = IssueForm()
    context = {"form": form, "msg": msg, "success": success}
    return render(request, 'books/books-issue.html', context)

请帮助插入数据。

标签: django-modelsforeign-keysinstancemodelform

解决方案


推荐阅读