Заполните поле в changeform_view

Первое, что вам нужно сделать, это убедиться, что файл существует. Для этого вам просто нужно попытаться открыть поток файлов на пути. После того, как вы открыли поток файлов, используйте stream.fail (), чтобы узнать, работает ли он, как ожидалось, или нет.

bool fileExists(string fileName)
{

ifstream test;

test.open(fileName.c_str());

if (test.fail())
{
    test.close();
    return false;
}
else
{
    test.close();
    return true;
}
}

Вы также должны убедиться, что указанный файл является правильным типом файла. Для этого вам нужно просмотреть путь к файлу, пока не найдете расширение файла. После того, как у вас есть расширение файла, убедитесь, что оно является CSV-файлом.

bool verifyExtension(string filename)
{
int period = 0;

for (unsigned int i = 0; i < filename.length(); i++)
{
    if (filename[i] == '.')
        period = i;
}

string extension;

for (unsigned int i = period; i < filename.length(); i++)
    extension += filename[i];

if (extension == ".csv")
    return true;
else
    return false;
}

Эта функция вернет расширение файла, которое будет использоваться позже в сообщении об ошибке.

string getExtension(string filename)
{
int period = 0;

for (unsigned int i = 0; i < filename.length(); i++)
{
    if (filename[i] == '.')
        period = i;
}

string extension;

if (period != 0)
{
    for (unsigned int i = period; i < filename.length(); i++)
        extension += filename[i];
}
else
    extension = "NO FILE";

return extension;
}

Эта функция фактически вызовет созданные выше проверки ошибок, а затем проанализирует файл.

void parseFile(string fileName)
{
    if (fileExists(fileName) && verifyExtension(fileName))
    {
        ifstream fs;
        fs.open(fileName.c_str());
        string fileCommand;

        while (fs.good())
        {
            string temp;

            getline(fs, fileCommand, '\n');

            for (unsigned int i = 0; i < fileCommand.length(); i++)
            {
                if (fileCommand[i] != ',')
                    temp += fileCommand[i];
                else
                    temp += " ";
            }

            if (temp != "\0")
            {
                // Place your code here to run the file.
            }
        }
        fs.close();
    }
    else if (!fileExists(fileName))
    {
        cout << "Error: The provided file does not exist: " << fileName << endl;

        if (!verifyExtension(fileName))
        {
            if (getExtension(fileName) != "NO FILE")
                cout << "\tCheck the file extension." << endl;
            else
                cout << "\tThere is no file in the provided path." << endl;
        }
    }
    else if (!verifyExtension(fileName)) 
    {
        if (getExtension(fileName) != "NO FILE")
            cout << "Incorrect file extension provided: " << getExtension(fileName) << endl;
        else
            cout << "There is no file in the following path: " << fileName << endl;
    }
}
0
задан mozman2 20 February 2019 в 09:46
поделиться

1 ответ

Я понял, что, вероятно, лучше всего использовать change_view и что это срабатывает до того, как содержимое извлекается из модели, поэтому я использую object_id, запрашиваю запись, делаю мой код, а затем сохраняю детали

def change_view(self, request, object_id, form_url='', extra_context=None):
    #Get the record
    obj = ShopApiDefinition.objects.get(id=object_id)
    #get a value as I use that in my code
    self.password = obj.password
    #do some code
    shopify_shop = "a value from my code"
    obj.about_the_shop = shopify_shop  # change field
    obj.save()  # this will update only

    return super(ShopApiDefinitionAdmin, self).change_view(
        request, object_id, form_url, extra_context=extra_context,
    )

Это, кажется, работает. Он сохранил значение в модели, и когда форма загружается, она заполняется как существующими данными, так и новыми данными из моего кода

Благодарю

Грант

0
ответ дан mozman2 20 February 2019 в 09:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: