如何使用选择模型从集合中筛选出某些字符

2024-03-28 19:13:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我对这方面还不太熟悉,所以请记住这一点。我正在创建一个Django网站,用户(正在学习汉语的人)可以上传汉语词汇表,该网站将返回一个用户可以下载的唯一字符列表(没有重复字符)

到目前为止,它正在工作,并且完成了我上面描述的一切。但我一直坚持的一点是,我想添加一个过滤器功能。我想添加一个选项,从用户下载的列表中排除一些更常见的汉字(我认为这是一个过滤功能)

我已经创建了一个下拉菜单,在用户按下upload之前,他们首先说他们是否要过滤掉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('%s\n' % 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': ''}

管理页面 I enter the names of each FilterText object here as well as the list of Chinese characters

如您所见,初始筛选步骤目前没有执行任何操作。我有点不知所措,不知道如何将其连接到视图中文件上传中的char\u隔离逻辑

我想要实现的逻辑是:如果用户选择一个FilterPreference,那么使用同名的FilterText。我也觉得我需要使用会话,但我对此并不乐观。欢迎任何建议