Django Формы/Модели: Добавление данных строк в существующий экземпляр модели через форму

Описание базы данных


Здравствуйте, моя проблема заключается в том, что у меня есть база данных с тремя моделями:

Beacon: Который собирает данные о хостах, которые пингуют на него ответные данные.

Command_Node: Который собирает команды, выполняемые данным узлом через форму, отправленную пользователем сайта.

Executed_Commands: Который будет собирать любые команды, содержащиеся в узле Command_Node, когда они будут собраны через запрос подключающейся машины через функцию, которая будет реализована, он также будет удалять команды в узле Command_Node, поскольку теперь они являются предыдущими командами. (Будет реализовано)

Проблема


Я хочу добавить несколько команд к одному экземпляру Command_Node. Через форму, которая позволяет мне выбрать, какому узлу я хочу дать команды, и которая позволяет мне выбрать, какие команды выдать какому узлу. Затем он должен добавить эти команды в столбец current_commands этого узла Command_Node в виде новой строки в выбранном экземпляре узла Command_Node.

Однако я не знаю, как это сделать. Мне не нужно редактировать существующие команды, мне не нужно создавать новый экземпляр Command_Node, как это делает текущий код. Мне просто нужно добавить больше строк к существующим экземплярам.

Любые идеи о том, как я могу это сделать, будут высоко оценены.

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

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'),
]


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

Forms.py

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

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'),
]


class Command_Form(ModelForm):
    class Meta:
        model = command_node
        fields = (
            'host_id',
            'current_commands'
        )
        
        host_id = forms.ModelChoiceField(
            required=True,
            queryset=beacon.objects.all(),
            widget=forms.SelectMultiple(
                attrs={
                    'class': 'form-control'
                },
            )
        )
        
        current_comamnds = forms.ChoiceField(
            required=True,
            choices=CHOICES
        )

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 = Command_Form(request.POST)
        if form.is_valid():
            form.save()
            return render(request, 'home.html', {"form": form})

    return render(request, 'home.html', {"form": form},)
Вернуться на верх