Как я могу отправить данные с помощью операции копирования-вставки в 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>
Дайте мне знать, сработает ли это у вас - я попробовал это с некоторыми фиктивными данными и несколькими инструкциями отладки, и это сработало отлично (смотрите скриншот ниже):
