首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django-Forms中使用外键失败并出现错误

在Django-Forms中使用外键失败并出现错误
EN

Stack Overflow用户
提问于 2021-03-19 12:26:26
回答 1查看 21关注 0票数 0

我正在制作一个应用程序,它将接受库存信息,如序列号和每一个其他细节,然后我正在制作另一个表单,将验证从上一个表单的条目。

我尝试了多个解决方案,但在相同的错误上可用,但在这里没有任何帮助。

我在这里粘贴代码。如果还有什么需要,请发表意见

models.py/inventory_app

代码语言:javascript
复制
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

如果我取消对该行的注释:

代码语言:javascript
复制
#from reservation_app.models import Reserve

我收到循环导入错误,因为

代码语言:javascript
复制
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/保留_应用程序

代码语言:javascript
复制
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中看到它,但现在情况并非如此。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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 (如果我粘贴完整的代码,只发布所需的代码,我认为这是不必要的)

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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中完成条目。

我是新来的,所以如果你能帮助我,我会非常感激,因为我被困在这里这么长时间了。

谢谢,Sameer

EN

回答 1

Stack Overflow用户

发布于 2021-03-19 12:48:54

由于循环导入而导致的错误,您可以这样解决。请使用to=‘’在外键和ManytoMany字段中,在下面的示例中,我们不需要从应用程序咨询中导入模型问题

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66702478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档