Как я могу отправить данные с помощью операции копирования-вставки в Django Views или model?

У меня такая очень сложная проблема. Она очень специфична, и вводить данные непросто.

Я думаю, как отправить данные в базу данных или, как вариант, просто отправить данные в код во внутреннем коде Django для обработки в представлениях.

Возможно ли, например, иметь возможность отправлять данные не по одному в единственном числе, а для заполнения поля ввода.

Заполняйте поле ввода не только в единственном числе. Например, как наиболее распространенный случай обработки данных в office или других приложениях - операция копирования/вставки.

Итак, в этой часто выполняемой популярной операции - например, мы хотим скопировать несколько элементов в таблицу Excel и попытаться вставить их каким-либо образом, отправить в код во внутреннем коде Django для обработки в представлениях.

Возможно ли реализовать что-то подобное?

Чтобы не вводить данные вручную, а как-то иметь возможность делать это в полуавтоматическом виде - копируя несколько ячеек с данными и вставляя их в какую-то форму или что-то подобное?

Как я могу отправить данные с помощью операции копирования-вставки в Django Views или model?

from django import forms
  
class InputForm(forms.Form):
  
    first_name = forms.CharField(max_length = 200)
    last_name = forms.CharField(max_length = 200)
    roll_number = forms.IntegerField(
                     help_text = "Enter 6 digit roll number"
                     )
    password = forms.CharField(widget = forms.PasswordInput())

from django.shortcuts import render
from .forms import InputForm
  
# Create your views here.
def home_view(request):
    context ={}
    context['form']= InputForm()
    return render(request, "home.html", context)

<form action = "" method = "post">
    {% csrf_token %}
    <table>
        {{ form.as_table }}
    </table>
    <input type="submit" value="Submit">
</form>

Итак, если я правильно понял ваш запрос, вы хотите:

  • Копирование и вставка данных из Excel;

  • Оформите это в виде;

  • Извлеките эти данные из своей базы данных при отправке не как единый объект, а как несколько объектов.

Предполагая, что все вышесказанное верно, я также предположу, что:

  • Каждая строка данных в вашем Excel соответствует строке (отдельному объекту) в таблице вашей базы данныхи

  • Каждый столбец в ваших данных Excel соответствует полю в этой таблице (вы не указываете название своей модели, но в нем есть поля first_name и last_name, поэтому я буду называть это вашей моделью Person).

Исходя из этого, вы должны быть в состоянии достичь своей цели массового импорта с помощью Copy + Paste, опираясь на следующие два факта:

При копировании и вставке данных Excel пробелы между столбцами обычно обрабатываются как Символ табуляции (\t), а пробелы между строками - как Символов новой строки (\n).

Таким образом, теоретически вы можете достичь своей цели, скопировав и вставив в один виджет формы textarea, а затем манипулируя этими данными либо в InputForm, либо в вашем home_view; сначала разделите ваши данные на строк путем разбиения на новых строк, а затем разбиение каждой строки на полей путем разбиения на Вкладки. После этого вы сможете правильно сохранить данные в своей модели.

Ниже приведен пример реализации:

# I assume you have a model like this in models.py
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=250)
    last_name = models.CharField(max_length=250)
    roll_number = models.PositiveIntegerField(unique=True)
    password = models.CharField(max_length=250)

# Rewrite your InputForm in forms.py as follows:
from django import forms
from .models import Person

class InputForm(forms.Form):
    bulk_data = forms.CharField(
        widget=forms.Textarea(
            attrs={'rows': 10, 'cols': 80} # Adjust size as needed
        ),
        help_text=(
            "Paste data from Excel in following format: "
            "FirstName<TAB>LastName<TAB>RollNumber<TAB>Password<NEWLINE>."
        )
    )

# Handle inside your views.py as follows:
from django.shortcuts import render
from .forms import InputForm
from .models import Person

def home_view(request):
    if request.method == 'POST':
        form = InputForm(request.POST)
        if form.is_valid():
            raw_data = form.cleaned_data['bulk_data']
            rows = raw_data.strip().split('\n')
            for line in rows:
                fields = line.strip().split('\t')
                if len(fields) == 4:
                    first_name, last_name, roll_number, password = fields
                    roll_number = int(roll_number) # Convert roll num to int
                    Person.objects.create(
                        first_name=first_name,
                        last_name=last_name,
                        roll_number=roll_number,
                        password=password
                    )
            return render(request, 'home.html', {'form': InputForm(), 'success': True})
    else:
        form = InputForm()
    return render(request, 'home.html', {'form': form})

Затем в вашем шаблоне home.html введите следующее (обратите внимание, что это , а не таблица и не отображается как единое целое):

<form action="" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit">
</form>

Дайте мне знать, сработает ли это у вас - я попробовал это с некоторыми фиктивными данными и несколькими инструкциями отладки, и это сработало отлично (смотрите скриншот ниже):

enter image description here

Вернуться на верх