Как я могу импортировать данные для моего параметра выбора Django? - PullRequest
0 голосов
/ 05 мая 2019

Я создаю модель, которая имеет поле персонажа, которое называется «страна».

Я очистил сеть и создал кортеж (в другом файле Python) со странами, которые я бы хотел, чтобы пользователь мог выбрать.Кортеж в другом файле находится именно в той форме, которая требуется Django, например (("BR", "Brazil"), ("US", "United States")).

Теперь, как мне импортировать этот кортеж стран в параметре 'choices' (например, myfile.COUNTRIES)?

Я просто не знаю, как это сделать.Как я могу импортировать эти данные в моем проекте Django?Есть ли лучшие практики или рекомендации для производства?

class Profile(models.Model):

    COUNTRIES = ???

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default="default.jpg", upload_to="profile_pics")
    countries = models.CharField(max_length=100, choices=COUNTRIES, blank=False, null=True)

Вот файл, содержащий кортеж:

from bs4 import BeautifulSoup
from urllib.request import urlopen

# Accessing website.
url = "..."
http_response = urlopen(url)
html = BeautifulSoup(http_response, "html.parser")

# Getting to the table.
table = html.find("table", {"class":"table table-hover"})

# Getting the table rows.
table_rows = table.find("tbody").find_all("tr")

# Getting the country names.
countries = ()
for row in table_rows:
    td = row.find_all("td")[1]
    name = td.find("a").get_text()
    universities += (name, name)

1 Ответ

0 голосов
/ 05 мая 2019

Обновленный ответ

Поскольку вы копируете данные, вам необходимо хранить их где-то для использования в моделях.Я бы предложил использовать базу данных.Вы можете создать модель с именем Country:

class Country(models.Model):
    code = models.CharField(max_length=10)
    name = models.CharField(max_length=20)

и использовать ее в своем скрипте следующим образом:

for row in table_rows:
    td = row.find_all("td")[1]
    name = td.find("a").get_text()
    Country.objects.get_or_create(name=name, code=name)

Для использования модели в скрипте вы можете конвертировать ваш скрипт в пользовательская команда управления django :

# your_app/management/commands/generate_countries.py
from django.core.management.base import BaseCommand
from django.utils import timezone
from bs4 import BeautifulSoup
from urllib.request import urlopen


class Command(BaseCommand):
    help = 'Generate Countries'

    def handle(self, *args, **kwargs):
        url = "..."
        http_response = urlopen(url)
        html = BeautifulSoup(http_response, "html.parser")
        table = html.find("table", {"class":"table table-hover"})
        table_rows = table.find("tbody").find_all("tr")


        for row in table_rows:
            td = row.find_all("td")[1]
            name = td.find("a").get_text()
            Country.objects.get_or_create(name=name, code=name)

, чтобы вы могли использовать ее следующим образом: python manage.py generate_countries

И использовать страну в других своих моделях, например так:

class Profile(models.Model):
   ...
   countries = models.ForeignKey(Country, on_delete=models.DO_NOTHING)

Старый ответ

Допустим, ваш файл называется countries.py, и в этом файле кортеж выглядит следующим образом:

COUNTRIES = (
    ("BR", "Brazil"),
    ("US", "The United States")
    ...
)

Теперь, скажем, его вта же папка, что и models.py, тогда вы можете просто импортировать ее следующим образом:

from .countries import COUNTRIES
# if countries.py is in x module(folder with __init__.py file) then use
# from x.countires import COUNTRIES

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default="default.jpg", upload_to="profile_pics")
    countries = models.CharField(max_length=100, choices=COUNTRIES, blank=False, null=True)
...