嘿,所以我有很多問題。實際上,試圖向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
:實際上,
command_node.host_id
是一個ForwardManyToOneDescriptor
(這是分配給標記為ForeignKey
的字段的類)。在這種情況下,您想要提供的queryset
參數是一組應該屬于模型beacon
的對象,該模型是與host_id
關聯的對象:這將在窗體中的dropsdown中以選項的形式顯示DB中的所有
beacon
對象(使用的小部件是Select
)。您還可以顯示與beacon
模型相關的任何查詢集。例如,如果只想顯示內部IP等于X.Y.Z.W
的beacon
對象,可以單獨指定queryset=beacon.objects.filter(internalIP="X.Y.Z.W")
。這里需要注意的是:
ForeignKey
的字段的可用選項時,已經使用了ModelChoiceField
。您可以在此處檢查Django在Model
字段和Form
字段之間的關聯:https://docs.djangoproject.com/en/4.0/topics/forms/modelforms/#field-types。如果希望所有beacon
對象都能夠在表單中進行選擇,則可以將代碼簡化為:UpperCaseCamelCase
中而不是在snake_case
中寫入類名(參見https://visualgit.readthedocs.io/en/latest/pages/naming_convention.html#classes)。如果采用此命名約定,則更容易將類與其實例區分開來。