Как использовать модель выбора для фильтрации определенных символов из набора

#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.