#python #django
Вопрос:
Я довольно новичок в этом деле, так что, пожалуйста, имейте это в виду. Я создаю веб-сайт Django, на котором пользователи (изучающие китайский язык) могут загружать списки китайского словаря, и сайт вернет список только уникальных символов (без дубликатов), которые пользователь может загрузить.
До сих пор он работает и делает все, что я описал выше. Но та часть, на которой я застрял, заключается в том, что я хочу добавить функциональность фильтра. Я хочу добавить возможность исключить некоторые наиболее распространенные китайские иероглифы из списка, который загружает пользователь (то, что я рассматриваю как функцию фильтра).
Я создал выпадающее меню, в котором, прежде чем пользователь нажмет «Загрузить», он сначала скажет, хочет ли он отфильтровать 100 наиболее распространенных символов, 500, ни одного и т. Д. Затем они переходят на другую страницу, где это должно учитываться при записи в файл, который он представляет для загрузки пользователем.
models.py
from django.db import models
#This is supplying the options on the first page
class FilterPreference(models.Model):
NONE = 'NO'
first_250 = 'F250'
first_500 = 'F500'
first_750 = 'F750'
first_1000 = 'F1000'
PREFERENCE_CHOICES = [
(NONE, 'None'),
(first_250, 'First 250'),
(first_500, 'First 500'),
(first_750, 'First 750'),
(first_1000, 'First 1000'),
]
preference = models.CharField(
max_length=100,
choices=PREFERENCE_CHOICES,
default=NONE,
)
def __str__(self):
return self.preference
#This is supplying the content of the filter
class FilterText(models.Model):
name = models.CharField(max_length=100)
text = models.TextField(null=True, blank=True)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
views.py
from django.shortcuts import render, redirect
import os
from django.conf import settings
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.http import Http404
from .forms import FilterForm
from .models import FilterText
def index(request):
if request.method != 'POST':
#No data submitted; create a blank form.
form = FilterForm()
else:
#POST data submitted; process data.
form = FilterForm(data=request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('converter/file_upload')
preference = FilterForm.cleaned_data['preference']
request.session['preference'] = preference
context = {'form':form}
return render(request, "converter/index.html", context)
def file_upload(request):
success = 0
if success == 1:
success = 2
if request.POST and request.FILES:
txtfile = request.FILES['txt_file']
def char_isolate():
#Open and read the uploaded file
ur_text = txtfile.read().decode("utf-8")
text = []
for char in ur_text:
if char not in text:
text.append(char)
text = str(text)
#finding unique
unique = []
for char in text:
if char not in unique:
unique.append(char)
unique = str(unique)
#cleaning
import string
nopunct_unique = unique.translate(str.maketrans('', '', string.punctuation))
nodigit_unique = nopunct_unique.translate(str.maketrans('', '', string.digits))
noletter_unique = nodigit_unique.translate(str.maketrans('', '', string.ascii_letters))
nochinesepunct_unique = noletter_unique.translate({ord(c): None for c in '。;:!?,、'})
clean_unique = nochinesepunct_unique.translate({ord(c): None for c in string.whitespace})
#I need to figure out how the preference fits in here
#Filter out common characters
filter_file = FilterText.objects.filter()
filter_file = str(filter_file)
filter=set([])
for word in filter_file:
filter.add(word)
filtered = set([])
for word in clean_unique:
if word not in filter:
filtered.add(word)
#write to file
f = open("text.txt","w ")
for word in filtered:
f.write('n' word)
f.close()
#write to file
tmp_path = os.path.join(settings.MEDIA_ROOT, 'tmp/text.txt')
with open(tmp_path, 'w') as f:
item = iter(filtered)
for _ in range(len(filtered)-1):
f.write('%sn' % next(item))
f.seek(0)
f.write('%s' % next(item))
f.close()
char_isolate()
success = 1
return redirect('converter:file_download')
context = {}
return render(request, "converter/file_upload.html", locals())
def file_download(request):
return render(request, 'converter/file_download.html')
def download(request):
path = "tmp/text.txt"
file_path = os.path.join(settings.MEDIA_ROOT, path)
if os.path.exists(file_path):
with open(file_path, 'rb') as f:
try:
response = HttpResponse(f)
response['content_type'] = "application/octet-stream"
response['Content-Disposition'] = 'attachment; filename=' os.path.basename(file_path)
return response
except Exception:
raise Http404
forms.py
from django import forms
from .models import FilterPreference
class FilterForm(forms.ModelForm):
class Meta:
model = FilterPreference
fields = ['preference']
labels = {'preference': ''}
Admin Page
I enter the names of each FilterText object here as well as the list of Chinese characters
As you can see, the initial filter step is currently not doing anything. I’m a bit at a loss as to how to connect that to the logic of char_isolate in file_upload in views.
The logic of what I want to achieve would be something like: if the user selects one FilterPreference, then use the FilterText with the same name. I also feel like I would need to use sessions, but I’m not positive about that. Open to any suggestions.