【问题标题】:Failing to Use Foreign Key in Django-Forms & Getting Errors未能在 Django-Forms 中使用外键并出现错误
【发布时间】:2021-06-16 12:37:26
【问题描述】:

我正在制作一个应用程序,它将接受序列号和所有其他详细信息等库存信息,然后我正在制作另一个表单,它将验证前一个表单中的条目。

我尝试了多种解决方案,这些解决方案在同一个错误中可用,但这里没有任何帮助。

我在这里粘贴代码。 如果还有什么需要的,欢迎评论

models.py/inventory_app

from django.db import models
#from reservation_app.models import Reserve
class Form1(models.Model):
    item = models.CharField(max_length=125)
    quantity = models.IntegerField(default=0)
    vendor = models.CharField(max_length=125)
    inward = models.IntegerField(default=1234)
    sno = models.ManyToManyField(max_length=100, to='reservation_app.Reserve')
    date = models.DateField()
    date_received = models.DateField()
    

    def __str__(self):
      return self.item

如果我取消注释该行:

#from reservation_app.models import Reserve

我收到循环导入错误

ImportError: cannot import name 'Form1' from partially initialized module 'inventory_app.models' (most likely due to a circular import) (C:\Users\satharkar\Desktop\altiostar\inventory\inventory_app\models.py)

models.py/reservation_app

from django.db import models
from inventory_app.models import Form1
# Create your models here.
class Reserve(models.Model):
    company = models.CharField(max_length=125)
    sno = models.ForeignKey(to='inventory_app.Form1', null=True, on_delete= models.SET_NULL)
    date_req = models.DateField()

我的所有更改都造成了巨大的混乱,以前我能够从 models.py/inventory_app 中获取输入,并且能够在 models.py/reservation_app 中看到它,但现在情况并非如此。

每当我尝试进入时,我都会收到以下错误:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/form1/

Django Version: 3.1.6
Python Version: 3.9.2
Installed Applications:
['django_filters',
 'inventory_app.apps.InventoryAppConfig',
 'reservation_app.apps.ReservationAppConfig',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'import_export']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "C:\Users\satharkar\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\satharkar\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\satharkar\Desktop\altiostar\inventory\inventory_app\views.py", line 28, in form1
    form1 = Form1(item=item, quantity=quantity , inward=inward , sno=sno , vendor=vendor, date=datetime.datetime.now() , date_received=date_received ) #security_stamp_date=security_stamp_date
  File "C:\Users\satharkar\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\base.py", line 496, in __init__
    _setattr(self, prop, kwargs[prop])
  File "C:\Users\satharkar\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\fields\related_descriptors.py", line 545, in __set__
    raise TypeError(

Exception Type: TypeError at /form1/
Exception Value: Direct assignment to the forward side of a many-to-many set is prohibited. Use sno.set() instead.

views.py/reservation_app

from django.shortcuts import render, HttpResponse
from .models import Reserve 
from reservation_app.models import Reserve


# Create your views here.
def reserve(request):
    if request.method == "POST":
        company = request.POST.get('company')
        sno = request.POST.get('sno')
        date_req = request.POST.get('date_req')
        reserve = Reserve(company=company, sno=sno, date_req=date_req ) #security_stamp_date=security_stamp_date 
        reserve.save()

    return render(request, 'home.html')

views.py/inventory_app

from django.shortcuts import render, HttpResponse
from inventory_app.models import Form1
import datetime
from .models import Form1 

def form1(request):
    if request.method == "POST":
        item = request.POST.get('item')
        quantity = request.POST.get('quantity')
        sno = request.POST.get('sno')
        inward = request.POST.get('inward')
        vendor = request.POST.get('vendor')
        date_received = request.POST.get('date_received')
     #   security_stamp_date = request.POST.get('security_stamp_date')
        form1 = Form1(item=item, quantity=quantity , inward=inward , sno=sno , vendor=vendor, date=datetime.datetime.now() , date_received=date_received ) #security_stamp_date=security_stamp_date 
        form1.save()

    return render(request, 'form1.html')

form1.html/inventory_app(如果我粘贴完整的代码,我认为这将是不必要的,只发布所需的代码)

<div class="form-group">
  <label for="exampleFormControlInput1">Serial Number</label>
  <input type="text" class="form-control" id="exampleFormControlInput1" name= "sno" placeholder="S/N123ABC123" required >
</div>

home.html/reservation_app

<div class="form-group">
  <label for="exampleFormControlInput1">Radio Serial Number</label>
  <input type="text" class="form-control" id="exampleFormControlInput1" name= "sno" placeholder="S/N123ABC123" required >
</div>

有人可以帮我解决这个问题吗? 我希望 sno 的条目应该来自 models.py/inventory_app 并且它应该显示在 models.py/reservation_app 上,或者你可以说它应该得到验证,然后只有条目应该从 reservation_app 完成。

我是新手,所以如果你能帮助我,我将不胜感激。

谢谢, 萨米尔

【问题讨论】:

    标签: python python-3.x django django-models django-forms


    【解决方案1】:

    由于循环导入而出现的错误,您可以这样解决 请使用 to='.'在外键和多对多字段中,在下面的示例中,我们不需要从应用咨询中导入模型问题

    
    from django.contrib.auth.models import User 
    from django.db import models
    
    class Customer(models.Model): 
        name = models.ForeignKey(User, null=True) 
        gender = models.CharField(max_length=100)
        skin_type = models.CharField(max_length=1000)
        hair_type = models.CharField(max_length=1000)
        bookmarked = models.ManyToManyField(to='consult.Question')
    
        def __str__(self):
            return str(self.name)
    

    【讨论】:

    • 我试过了,但同样的错误仍然没有发生。它说Direct assignment to the forward side of a many-to-many set is prohibited. Use sno.set() instead.
    猜你喜欢
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2019-07-27
    • 2016-04-25
    • 2015-06-06
    • 1970-01-01
    相关资源
    最近更新 更多