Django表單“'ForwardManyToOneDescriptor'對象沒有屬性“all”

嘿,所以我有很多問題。實際上,試圖向home-page添加一個表單,用戶可以根據DB對象選擇選項。提交后,頁面將刷新,表單可以再次使用。

Forms.py

rom django import forms
from django.forms import ChoiceField, ModelForm, RadioSelect
from .models import command_node


class command_form(ModelForm):
    class Meta:
        model = command_node
        fields = (
            'host_id',
            'current_commands'
        )

        host_id = forms.ModelChoiceField(
            required=True,
            queryset=command_node.host_id,
            widget=forms.Select(
                attrs={
                    'class': 'form-control'
                },
            )
        )

        current_comamnds = forms.ChoiceField(
            required=True,
            attrs={
                'class': 'form-control'
            },
            
            choices=[
                ('Sleep', "Sleep"),
                ('Open SSH_Tunnel', 'Open SSH_Tunnel'),
                ('Close SSH_Tunnel', 'Close SSH_Tunnel'),
                ('Open TCP_Tunnel', 'Open TCP_Tunnel'),
                ('Close TCP_Tunnel', 'Close TCP_Tunnel'),
                ('Open Dynamic', 'Open Dynamic'),
                ('Close Dynamic', 'Close Dynamic'),
                ('Task', 'Task'),
            ])

Models.py

from tkinter import CASCADE
from turtle import update
from django.db import models

class beacon(models.Model):
    host_id = models.BigAutoField('Id', primary_key=True)
    hostname = models.CharField('Hostname', max_length=200)
    internalIp = models.CharField('Internal-IP', max_length=200)
    externalIp = models.CharField('External-IP', max_length=200)
    current_user = models.CharField('Current_User', max_length=200)
    os = models.CharField('OS', max_length=200)
    admin = models.CharField('Admin', max_length=200)
    
    def __str__(self):
        return self.hostname

class command_node(models.Model):
    host_id = models.ForeignKey(beacon, on_delete=models.CASCADE)
    current_commands = models.CharField('current_command', max_length=50, null=True)
    previous_commands = models.CharField('previous_commands', max_length=2000, null=True)
    
    def __str__(self):
        return str(self.host_id)

views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import beacon
from .models import command_node
from .forms import command_form
from django.http import HttpResponseRedirect

def home(request):
    form = command_form,
    if request.method == "POST":
            form = form(request.POST)
            if form.is_valid():
                form.save()
                return render(request, 'home.html', context)
    context = {'form':form},
    return render(request, 'home.html', context)

相關HTML部分

</br>
</br>
    <form action="" method=POST>
        {% csrf_token %}
        {{ form.as_p }}
        {{form}}
        <button type="Submit" class="btn btn-secondary btn-sm">Submit</button>
    </form>
</body>
</html>

urls.py

from django.contrib import admin
from django.urls import path
from django.urls import include, re_path
from .forms import command_node
from . import views

urlpatterns = [
    re_path('home/', views.home)
]

當我嘗試運行服務器,甚至現在遷移時,我會得到以下結果。

PS C:\Python-projects\commandsite> python manage.py makemigrations
Traceback (most recent call last):
  File "C:\Python-projects\commandsite\manage.py", line 22, in <module>
    main()
  File "C:\Python-projects\commandsite\manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\__init__.py", line 440, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\base.py", line 414, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\base.py", line 455, in execute
    self.check()
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\management\base.py", line 487, in check
    all_issues = checks.run_checks(
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\checks\registry.py", line 88, in run_checks
    new_errors = check(app_configs=app_configs, databases=databases)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\checks\urls.py", line 14, in check_url_config
    return check_resolver(resolver)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\checks\urls.py", line 24, in check_resolver
    return check_method()
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\urls\resolvers.py", line 480, in check
    for pattern in self.url_patterns:
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\utils\functional.py", line 49, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\urls\resolvers.py", line 696, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\utils\functional.py", line 49, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\urls\resolvers.py", line 689, in urlconf_module
    return import_module(self.urlconf_name)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "C:\Python-projects\commandsite\commandsite\urls.py", line 22, in <module>
    re_path('website/', include('website.urls'))
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\urls\conf.py", line 38, in include
    urlconf_module = import_module(urlconf_module)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "C:\Python-projects\commandsite\website\urls.py", line 4, in <module>
    from .forms import command_node
  File "C:\Python-projects\commandsite\website\forms.py", line 6, in <module>
    class command_form(ModelForm):
  File "C:\Python-projects\commandsite\website\forms.py", line 7, in command_form
    class Meta:
  File "C:\Python-projects\commandsite\website\forms.py", line 14, in Meta
    host_id = forms.ModelChoiceField(
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\forms\models.py", line 1463, in __init__
    self.queryset = queryset
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\forms\models.py", line 1488, in _set_queryset
    self._queryset = None if queryset is None else queryset.all()
AttributeError: 'ForwardManyToOneDescriptor' object has no attribute 'all'
PS C:\Python-projects\commandsite>

在我嘗試添加表單之前,這一切都正常工作。因為我一直在嘗試修補它以獲得一種形式,這就是我面臨的問題。因此,任何幫助都將大受歡迎。因為我不知道我做錯了什么。

? 最佳回答:

查看您的代碼,會出現錯誤,因為您正在表單中指定queryset=command_node.host_id

    host_id = forms.ModelChoiceField(
        required=True,
        queryset=command_node.host_id,
        widget=forms.Select(
            attrs={
                'class': 'form-control'
            },
        )
    )

實際上,command_node.host_id是一個ForwardManyToOneDescriptor(這是分配給標記為ForeignKey的字段的類)。在這種情況下,您想要提供的queryset參數是一組應該屬于模型beacon的對象,該模型是與host_id關聯的對象:

    host_id = forms.ModelChoiceField(
        required=True,
        queryset=beacon.objects.all(),
        widget=forms.Select(
            attrs={
                'class': 'form-control'
            },
        )
    )

這將在窗體中的dropsdown中以選項的形式顯示DB中的所有beacon對象(使用的小部件是Select)。您還可以顯示與beacon模型相關的任何查詢集。例如,如果只想顯示內部IP等于X.Y.Z.Wbeacon對象,可以單獨指定queryset=beacon.objects.filter(internalIP="X.Y.Z.W")

這里需要注意的是:

  • Django在顯示依賴ForeignKey的字段的可用選項時,已經使用了ModelChoiceField。您可以在此處檢查Django在Model字段和Form字段之間的關聯:https://docs.djangoproject.com/en/4.0/topics/forms/modelforms/#field-types。如果希望所有beacon對象都能夠在表單中進行選擇,則可以將代碼簡化為:
class command_form(ModelForm):
    class Meta:
        model = command_node
        fields = (
            'host_id',
            'current_commands'
        )

        current_comamnds = forms.ChoiceField(
            required=True,
            attrs={
                'class': 'form-control'
            },
            
            choices=[
                ('Sleep', "Sleep"),
                ('Open SSH_Tunnel', 'Open SSH_Tunnel'),
                ('Close SSH_Tunnel', 'Close SSH_Tunnel'),
                ('Open TCP_Tunnel', 'Open TCP_Tunnel'),
                ('Close TCP_Tunnel', 'Close TCP_Tunnel'),
                ('Open Dynamic', 'Open Dynamic'),
                ('Close Dynamic', 'Close Dynamic'),
                ('Task', 'Task'),
            ])
  • Python(因此也在Django)中的一種常見做法是在UpperCaseCamelCase中而不是在snake_case中寫入類名(參見https://visualgit.readthedocs.io/en/latest/pages/naming_convention.html#classes)。如果采用此命名約定,則更容易將類與其實例區分開來。
主站蜘蛛池模板: 久久久国产精品无码一区二区三区 | 午夜一区二区免费视频| 日韩一区二区三区不卡视频| 无码av人妻一区二区三区四区| 精品乱码一区二区三区四区| 色妞色视频一区二区三区四区 | 日韩精品无码人妻一区二区三区 | 国产亚洲福利精品一区| 高清一区二区三区免费视频| 一本久久精品一区二区| 无码欧精品亚洲日韩一区夜夜嗨| 久久se精品一区二区国产| 好吊妞视频一区二区| 蜜臀Av午夜一区二区三区| 精品国产一区二区三区av片| 一本AV高清一区二区三区| 国产AV天堂无码一区二区三区| 国产成人无码AV一区二区在线观看| 国产一区二区三区露脸| 国产成人无码aa精品一区| 国产成人一区二区三区| 国产成人精品a视频一区| 无码人妻精品一区二区三区99性| 高清无码一区二区在线观看吞精| 久久无码人妻一区二区三区| 精品一区二区三区无码视频| 无码少妇一区二区三区芒果| 国产乱码精品一区二区三区四川人 | 国产一区二区三区免费看 | 亚洲性日韩精品一区二区三区| 亚洲日韩一区二区一无码| 久久精品国产第一区二区三区| 国内国外日产一区二区| 久久精品无码一区二区app| 国产精品xxxx国产喷水亚洲国产精品无码久久一区| 国产伦精品一区二区三区| 久久毛片免费看一区二区三区| 国产91精品一区| 亚洲一区二区女搞男| 亚洲AV日韩AV天堂一区二区三区| 精品视频一区二区三区在线观看|