0

i want support search with all language in search bar , but when i write an Arabic word for example , it says

Server error (500)

my code | Models.py :

class Homepage(models.Model):
name = models.CharField(max_length=50,default="")
app_contect = models.CharField(max_length=240,default="")
page_url = models.URLField(max_length=250,default="")
app_image = models.ImageField(upload_to='images/',null=True, blank=True)

def get_image(self):
    if self.app_image and hasattr(self.app_image, 'url'):
        return self.app_image.url
    else:
        return '/path/to/default/image'

def __str__(self):
    return self.name



class PCprogram(models.Model):
    name = models.CharField(max_length=50,default="")
    app_contect = models.CharField(max_length=240,default="")
    page_url = models.URLField(max_length=250,default="")
    app_image = models.ImageField(upload_to='images/',null=True, blank=True)
    post_date = models.DateTimeField(auto_now_add=True, null=True, blank=True)

    def get_image(self):
        if self.app_image and hasattr(self.app_image, 'url'):
        return self.app_image.url
    else:
        return '/path/to/default/image'

    def __str__(self):
        return self.name
    
    class Meta:
        ordering = ('-post_date',)

views.py :

def search(request):

if request.method == 'GET':
    query= request.GET.get('q')
    submitbutton= request.GET.get('submit')

    if query is not None:

        home_database= Homepage.objects.filter(Q(name__icontains=query) | Q(app_contect__icontains=query) | Q(page_url__icontains=query) | Q(app_image__icontains=query))


        pcprograms_database= PCprogram.objects.filter(Q(name__icontains=query) | Q(app_contect__icontains=query) | Q(page_url__icontains=query) | Q(app_image__icontains=query))


            results = list(
                    sorted(
                        chain(pcprograms_database,home_database),
                        key=attrgetter('name'),
                        reverse=True  # Optional
                    ))
        paginator = Paginator(results,6)
        page = request.GET.get('page')
        results = paginator.get_page(page)

        context={'results': results,
                 'submitbutton': submitbutton}

        return render(request, 'html_file/search.html', context)

    else:
        return render(request, 'html_file/search.html')

else:
    return render(request, 'html_file/search.html')

search form in html page :

                    <form id="search_form" action="{% url 'search' %}" method="GET" value="{{request.GET.q}}" class="form-inline">
                    <input id="search_box" type="text" name="q"
                              placeholder=" Search For ... "
                              style="color:black"
                              class="form-control mr-sm-2"/>
                    <input class="btn btn-outline-text-white my-2 my-sm-0" id="search_button" type="submit" name="submit" value="Search"/>
                </form>

i tried add charset="utf-8" in form , but it doesn't work .

also i tried add # -- coding: utf-8 -- on the first line in models.py , and also but it doesn't work .

I'm using MySQL Database

Kok Hyvv
  • 145
  • 1
  • 9
  • Is DEBUG setting False? Because if DEBUG is True in settings you don't just get a 500 error but also a pointer what exactly happened. – Lucas Moeskops Aug 22 '20 at 19:32
  • yes False i can set it True and see what happened thanks – Kok Hyvv Aug 23 '20 at 07:04
  • i set Debug = True and it show the error to me ,,,,,,,,, InternalError at /search (1267, "Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'") – Kok Hyvv Aug 23 '20 at 07:23
  • and this ,, Exception Location: /home/django/3.7/lib/python3.7/site-packages/pymysql/err.py in raise_mysql_exception, line 109 – Kok Hyvv Aug 23 '20 at 07:24

1 Answers1

0

It looks like a problem with your MySQL table character sets. They are unable to store Arabic text and need to be changed to utf-8, see for example Save Data in Arabic in MySQL database.

Follow e.g. this article for help on converting this: https://www.a2hosting.com/kb/developer-corner/mysql/convert-mysql-database-utf-8.

Most relevant parts:
In terminal:

$ set DBNAME=<my_database_name>
$ mysql --database=DBNAME -B -N -e "SHOW TABLES" | awk '{print "SET foreign_key_checks = 0; ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; SET foreign_key_checks = 1; "}' | mysql --database=DBNAME

In MySQL queries:

ALTER DATABASE <my_database_name> CHARACTER SET utf8 COLLATE utf8_general_ci;
Lucas Moeskops
  • 5,445
  • 3
  • 28
  • 42