Вам, вероятно, нужно сначала сохранить файл на диск. Команда loaddata
ожидает, что аргумент является путем к файлу фиксации на диске.
Вы можете сохранить загруженный файл во временный файл и затем вызвать loaddata
для него.
Например:
import tempfile
from django.core.management import call_command
@login_required
@product_1_activation
def company_upload(request):
if request.method == 'POST':
new_company = request.FILES['myfile']
with tempfile.NamedTemporaryFile(dir='/tmp') as temp:
for chunk in new_company.chunks():
temp.write(chunk)
call_command('loaddata', '/tmp/{}'.format(temp.name), verbosity=0)
return render(request, 'company/import.html')
Учитывая, что Вы только обрабатываете три различных типов, я предложил бы три различных метода вместо этого - общие методы являются лучшими, когда они работают хорошо с каждым аргументом типа, который разрешен ограничениями типа.
Кроме того, я настоятельно рекомендовал бы это для int
и DateTime
Вы указываете культуру для использования - она не должна действительно зависеть от культуры, в которой сервер, оказывается, находится. (Если у Вас есть код для предположения культуры пользователя, Вы могли бы использовать это вместо этого.) Наконец, я также предложил бы поддерживать хорошо указанный набор DateTime
форматы, а не только безотносительно TryParse
поддержки по умолчанию. (Я в значительной степени всегда использую ParseExact
/TryParseExact
вместо Parse
/TryParse
.)
Обратите внимание, что строковая версия ничего не должна действительно делать, учитывая, что value
уже строка (хотя Ваш текущий код преобразовывает "" в null
, который может или не может быть тем, что Вы хотите).
В моем приложении я использовал следующую функцию:-
public static class WebUtil
{
public static T GetValue<T>(string key, StateBag stateBag, T defaultValue)
{
object o = stateBag[key];
return o == null ? defaultValue : (T)o;
}
}
Необходимое значение по умолчанию возвращается, если параметр не был предоставлен, тип выведен из defaultValue, и исключения кастинга повышены по мере необходимости.
Использование следующим образом:-
var foo = WebUtil.GetValue("foo", ViewState, default(int?));
Мне кажется, что Вы делаете, много unecesary вводит convertions. tempValue переменные arere свинцовый из типа Вы пытаетесь возвратиться. Аналогично в строковом случае значение уже является строкой, поэтому просто возвращают его вместо этого.
Простой способ синтаксического анализа (если вы не хотите выполнять преобразование типов) -
HttpUtility.ParseQueryString(queryString);
Вы можете извлечь строку запроса из URL-адреса с помощью
new Uri(url).Query
I've written the following method to parse the QueryString to strongly typed values:
public static bool TryGetValue<T>(string key, out T value, IFormatProvider provider)
{
string queryStringValue = HttpContext.Current.Request.QueryString[key];
if (queryStringValue != null)
{
// Value is found, try to change the type
try
{
value = (T)Convert.ChangeType(queryStringValue, typeof(T), provider);
return true;
}
catch
{
// Type could not be changed
}
}
// Value is not found, return default
value = default(T);
return false;
}
Usage example:
int productId = 0;
bool success = TryGetValue<int>("ProductId", out productId, CultureInfo.CurrentCulture);
For a querystring of ?productId=5
the bool
would be true and int productId
would equal 5.
For a querystring of ?productId=hello
the bool
would be false and int productId
would equal 0.
For a querystring of ?noProductId=notIncluded
the bool
would be false and int productId
would equal 0.