json fail in django ('tuple' object has no attribute '_meta') - python

my view:
#csrf_exempt
def get_order_detail(request):
order_id = request.GET['order_id']
products_of_order = OrdersProducts.objects.filter(order=order_id).values('product__title', 'cargo_no', 'order',
'units', "status").values_list()
data = serializers.serialize("json", products_of_order)
return HttpResponse(data, content_type="text/json", safe=False)
my model:
class OrdersProducts(models.Model):
STATUS_CHOICES = (
(u'0', _(u'cancel')),
(u'1', _(u'waiting_for_payment')),
(u'2', _(u'waiting_for_cargo')),
(u'3', _(u'on_the_road')),
(u'4', _(u'success_shipping')),
(u'5', _(u'failure_shipping')),
(u'6', _(u'return'))
)
units = models.PositiveSmallIntegerField(default=1, null=False, blank=False)
status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='1')
cargo_no = models.CharField(max_length=11, default='', null=True, blank=False)
product = models.ForeignKey(Products)
order = models.ForeignKey(Orders)
optional_price = models.ForeignKey(OptionalPrice, default=1)
company_optional_price = models.ForeignKey(CompanyOptionalPrice, default=1)
cdate = models.DateTimeField(auto_now_add=True)
my template:
$('.order-btn').click(function(event) {
var order = $(this).data('id');
var items = [];
$('#table_order').find('tbody').empty();
if ( order != "" ) {
items.push ('');
$.getJSON ( '{% url 'get_order_detail' %}', {order_id:order}, function(data) {
console.log('sa');
$.each ( data, function ( index, val ) {
console.log(data);
items.push ( '<tr><td>' + val.fields.order + '</td> <td>' + val.fields.product_name + '</td> <td>' + val.fields.units + '</td> <td>' + val.fields.optional_price + '</td> <td>' + val.fields.get_status_display + '</td> <td>' + val.fields.cargo_no + '</td></tr>');
console.log(items)
} );
$('#table_order').find('tbody').append( items );
} );
}
});
error:
tuple' object has no attribute '_meta'
I need a values('product__title', 'cargo_no', 'order', 'units', "status"). If I can my mymodel.objects.all(), don't use product.name values,etc.
Note: My template page is old values when I use to direct my model.

Related

How do I solve django.db.utils.IntegrityError: UNIQUE constraint failed?

How do I solve django.db.utils.IntegrityError: UNIQUE constraint failed?
error code is
django.db.utils.IntegrityError: UNIQUE constraint failed: Movies_comment.user_id, Movies_comment.tv_or_movie_id.
This error occurs Comment(comment=form.cleaned_data["comment"],user=request.user,stars=form.cleaned_data["stars"],tv_or_movie=tv_or_movie_object).save()
views.py
def view_tv_and_movie_detail(request, type_movie_or_tv, id):
tv_or_movie_object, _ = TVAndMovie.objects.get_or_create(tmdb_id=id, judge_tv_or_movie=type_movie_or_tv)
detail_tv_or_movie = TvAndMovieDetailhelp(request, tv_or_movie_object, 3)
mycomment_obj = detail_tv_or_movie.get_user_post_comment_for_tv_or_movie()
if request.method == "POST":
if request.POST.get("action") == "delete":
mycomment_obj.delete()
return redirect("view_tv_and_movie_detail", type=type_movie_or_tv, id=id)
else:
form = CommentCreateForm(request.POST, instance=mycomment_obj)
if form.is_valid() and request.POST.get("action") == "update":
form.save()
return redirect("view_tv_and_movie_detail", type=type_movie_or_tv, id=id)
elif form.is_valid() and request.POST.get("action") == "create":
Comment(
comment=form.cleaned_data["comment"],
user=request.user,
stars=form.cleaned_data["stars"],
tv_or_movie=tv_or_movie_object,
).save()
return redirect("view_tv_and_movie_detail", type=type_movie_or_tv, id=id)
else:
form = CommentCreateForm(instance=mycomment_obj)
data = detail_tv_or_movie.get_object_tv_or_movie_data()
recommendations = detail_tv_or_movie.get_recommendations_tmdb_data()
pages = detail_tv_or_movie.get_page_comment()
average = tv_or_movie_object.average_stars()
context = {
"data": data,
"recommendations": recommendations,
"type": "movie",
"mycomment": mycomment_obj,
"average": average,
"form": form,
"pages": pages
}
return render(request, "Movie/movie_detail.html", context)
models.py
class TVAndMovie(models.Model):
tmdb_id = models.CharField(
validators=[alphanumeric], max_length=9999
)
judge_tv_or_movie = models.CharField(
blank=False, null=False, default="movie", max_length=20
)
stars = models.FloatField(
blank=False,
null=False,
default=0,
validators=[MinValueValidator(0.0), MaxValueValidator(10.0)],
)
def get_judge_tv_or_movie(self) -> str:
return self.judge_tv_or_movie
def get_comments(self) -> object:
return Comment.objects.prefetch_related("tv_or_movie").filter(
tv_or_movie_id=self.id
)
def average_stars(self) -> float:
comments = self.get_comments()
n_comments = comments.count()
if n_comments:
self.stars = round(
sum([comment.stars for comment in comments]) / n_comments, 3
)
else:
self.stars = 0
self.save()
return self.stars
class Comment(models.Model):
comment = models.TextField(max_length=1000)
stars = models.FloatField(
blank=False,
null=False,
default=0,
validators=[MinValueValidator(0.0), MaxValueValidator(10.0)],
)
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
tv_or_movie = models.ForeignKey(TVAndMovie, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
unique_together = ("user", "tv_or_movie")
indexes = [models.Index(fields=["user", "tv_or_movie"])]
def __str__(self) -> str:
return self.comment[:20]
helper_views.py
class TvAndMovieDetailhelp:
def __init__(self, request, obj_tv_or_movie: object, page_num: int) -> None:
self.request = request
self.obj_tv_or_movie: object = obj_tv_or_movie
self.page_num: int = page_num
def get_object_tv_or_movie_data(self) -> dict:
tv_or_movie_url: str = (
"https://api.themoviedb.org/3/" +
self.obj_tv_or_movie.judge_tv_or_movie +
"/" +
str(self.obj_tv_or_movie.tmdb_id) +
"?api_key=" +
TMDB_API_KEY +
"&language=en-US"
)
return (requests.get(tv_or_movie_url)).json()
def get_recommendations_tmdb_data(self) -> dict:
recommendations_url: str = (
"https://api.themoviedb.org/3/" +
self.obj_tv_or_movie.judge_tv_or_movie +
"/" +
str(self.obj_tv_or_movie.tmdb_id) +
"/recommendations?api_key=" +
TMDB_API_KEY +
"&language=en-US"
)
return (requests.get(recommendations_url)).json()
def get_comment_for_tv_or_movie(self) -> object:
if self.request.user.id is not None:
return (
Comment.objects.filter(tv_or_movie=self.obj_tv_or_movie.id)
.exclude(user=self.request.user)
.order_by("-updated_at")
)
else:
return Comment.objects.filter(tv_or_movie=self.obj_tv_or_movie.id).order_by(
"-updated_at"
)
def get_user_post_comment_for_tv_or_movie(self) -> object:
if self.request.user.id is not None:
try:
return Comment.objects.get(
user=self.request.user, tv_or_movie=self.obj_tv_or_movie
)
except Comment.DoesNotExist:
return None
else:
return None
def get_page_comment(self):
other_comments = self.get_comment_for_tv_or_movie()
paginator = Paginator(other_comments, self.page_num)
page = self.request.GET.get("page", 1)
try:
pages = paginator.page(page)
except PageNotAnInteger:
pages = paginator.page(1)
except EmptyPage:
pages = paginator.page(1)
return pages
def send_contexts_detail(self,form) -> dict:
data_for_tvor_movie = self.get_object_tv_or_movie_data()
recommendations_data = self.get_recommendations_tmdb_data()
for_movie_or_tv = self.obj_tv_or_movie.judge_tv_or_movie
mycomment_obj = self.get_user_post_comment_for_tv_or_movie()
average = self.obj_tv_or_movie.getaverage_stars()
pages = self.get_page_comment()
context = {
"data": data_for_tvor_movie,
"recommendations": recommendations_data,
"type": for_movie_or_tv,
"mycomment": mycomment_obj,
"average": average,
"form": form,
"pages": pages, # NOTE add the comment to context
}
return context
tv_or_movie before saving i.e.
if not Comment.objects.filter(user=request.user, tv_or_movie=tv_or_movie_object).exists()
Comment(comment=form.cleaned_data["comment"], user=request.user, stars=form.cleaned_data["stars"], tv_or_movie=tv_or_movie_object).save()

No file was submitted error when uploading data to Django REST API

Im using angular/typescript where I upload a form of data to my Django REST API. With the data all is correct, because I can log my whole form and I get back all my data. But when it comes to upload the data I get this error:
{src: ["No file was submitted."], tag: ["This field is required."]}
so somehow it does not recognize my data because Im actually submitting data.
frontend code
upload.service
const httpOptions = {
headers: new HttpHeaders({'Content-Type': 'multipart/form-data'})
};
...
uploadPost(src: File, tag: string) {
return this.http.post<any>(`{this.url}/posts/`, {src, tag}, httpOptions);
}
post.page
ngOnInit() {
this.storage.get('image_data').then((imageFile) => {
console.log(imageFile)
this.categoryForm.patchValue({
'image': this.storage.get('image_data')
});
});
this.categoryForm = new FormGroup({
'category': new FormControl('', Validators.compose([
Validators.maxLength(25),
Validators.minLength(1),
Validators.required
])),
'image': new FormControl(null),
});
apiSubmit() {
console.log('logged')
console.log(this.f.image);
this.submitted = true;
if (this.categoryForm.invalid) {
return;
}
this.isLoading = true;
this.loadingEl.present();
this.uploadService.uploadPost(
this.f.image,
this.f.category
)
.pipe(tap(x => this.loadingEl.dismiss())
)
.subscribe(
data => {
this.router.navigate(['one']);
},
error => {
this.error = error;
}
);
}
Django:
models.py
class Post(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='posts', on_delete=models.CASCADE)
src = models.ImageField(blank=False, null=False, editable=False, upload_to=utils.get_file_path,)
date_posted = models.DateTimeField(auto_now_add=True, editable=False)
last_modified = models.DateTimeField(auto_now=True)
when = models.FloatField(blank=True, null=True)
lock = models.BooleanField(default=False)
des = models.CharField(
max_length=100,
validators=[
RegexValidator(
regex='^[-_a-zA-Z0-9\.]+$',
message='only 1 to 20 characters and only letters, numbers, point, minus and underscore are allowed',
),
])
view.py
#swagger_auto_schema(request_body=doc_serializer.CreatePostDummy, responses={201: PostSerializer})
def create(self, request, *args, **kwargs):
"""permission required: authenticated. Note: the schema is not json it's multipart"""
return super().create(request, *args, **kwargs)
doc_serializers.py
class CreatePostDummy(serializers.HyperlinkedModelSerializer):
`enter code here`user = serializers.HyperlinkedRelatedField(required=False, read_only=True, view_name='user-detail')
src = serializers.CharField(required=True, help_text='Not Char but image upload field')

jQuery wrong data attribute

I'm working on my first Django project (IDE: PyCharm, OS: Win10). There is a problem with .js. I renamed variable called 'nmb' to 'quantity' in the script. This variable was created for counting products in user's cart. Then I've got an error that ItemInCart model gets an 'undefined' quantity instead of some countable value. It happens because only on 8000 port jQuery still seeks for 'nmb' not for data attr name 'quantity'. Running my app on any other port, like 8023 everything works well.
JS
$ (document).ready(function () {
var form = $('#form_buy_item');
console.log(form);
form.on('submit', function (e) {
e.preventDefault();
var quantity = $('#quantity').val();
console.log(quantity);
var csrf_token;
var submit_btn = $('#submit_btn');
var item_id = submit_btn.data('item_id');
var item_name = submit_btn.data('item_name');
var item_price = submit_btn.data('item_price');
console.log(item_name, item_id);
var data = {};
data.item_id = item_id;
data.item_name = item_name;
data.quantity = quantity;
csrf_token = $('#form_buy_item [name = "csrfmiddlewaretoken"]').val();
data["csrfmiddlewaretoken"] = csrf_token;
// use action attribute for multi-language support
var url = form.attr("action");
console.log(data);
$.ajax({
url: url,
type: 'POST',
data: data,
cache: true,
success: [ function (data) {
console.log("OK");
console.log(data.items_total_count);
if (data.items_total_count){
$('#cart_total_quantity').text('data.items_total_count')
}
} ],
error: function() {
console.log("error")
}
});
$('.cart-items ul').append('<li>'+item_name +', ' + quantity + ' item(s), ' + item_price + '$ per item '+
'<a class="delete-item" href=""> x <a>' + '</li>')
});
function displayCartItems(){
$('.cart-items').toggleClass('hidden');
}
$('.cart-container').on('click, hover', function (e) {
e.preventDefault();
displayCartItems();
});
$('.cart-container').mouseover('click, hover', function (e) {
e.preventDefault();
displayCartItems();
});
$('.cart-container').mouseout('click, hover', function (e) {
e.preventDefault();
displayCartItems();
});
$(document).click('click', 'delete-item', function(e) {
e.preventDefault();
$(this).closest('li').removeAttr()
});
});
Model
class ItemInCart(models.Model):
session_key = models.CharField(max_length=128, null=True, blank=True, default=None)
order = models.ForeignKey(Order, on_delete=models.SET_DEFAULT, blank=True, null=True, default=None)
item = models.ForeignKey(Item, on_delete=models.SET_DEFAULT, blank=True, null=True, default=None)
quantity = models.IntegerField(default=1)
price_per_item = models.DecimalField(max_digits=10, decimal_places=2, default=0)
total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
is_active = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
class Meta:
verbose_name = 'Item in cart'
verbose_name_plural = 'Items in cart'
def save(self, *args, **kwargs):
price_per_item = self.item.price
self.price_per_item = price_per_item
self.total_price = int(self.quantity) * self.price_per_item
super(ItemInCart, self).save(*args, **kwargs)
Views
def cart_add(request):
return_dictionary = dict()
session_key = request.session.session_key
print(request.POST)
data = request.POST
item_id = data.get('item_id')
quantity = data.get('quantity')
# is_delete = data.get('is_delete')
new_item = ItemInCart.objects.create(session_key=session_key, item_id=item_id, quantity=quantity)
items_total_count = ItemInCart.objects.filter(session_key=session_key, is_active=True).count()
return_dictionary['items_total_count'] = items_total_count
print(request.POST)
return JsonResponse(return_dictionary)
This is happened on 8000, 8001
8024 is fine
Please clear browser history then run the application.

Django 1.8.5. How can I define the user language in Model.Admin in the admin.py of my app using get_language()?

I want to create a package for django on three languages. And I need to show data from db to admin depending on his language.
My model:
class Author(models.Model):
name_en = models.CharField(max_length=200, default='No name')
name_ua = models.CharField(max_length=200, default='No name')
name_ru = models.CharField(max_length=200, default='No name')
biography_en = models.TextField(default='No biography')
biography_ua = models.TextField(default='No biography')
biography_ru = models.TextField(default='No biography')
def __str__(self):
lang = get_language()
if lang == 'ru':
author = self.name_ru
elif lang == 'ua':
author = self.name_ua
else:
author = self.name_en
return author
class Phrases(models.Model):
phrase_en = models.TextField(default='No phrase')
phrase_ua = models.TextField(default='No phrase')
phrase_ru = models.TextField(default='No phrase')
author = models.ForeignKey(Author)
PHRASE_STATUS = (
('published', 'Published'),
('draft', 'Draft'),
('unpublished', 'Unpublished'),
)
showed = models.BooleanField(default=False)
phrase_status = models.CharField(max_length=11, choices=PHRASE_STATUS, default='published')
pub_date = models.DateTimeField('Date published', auto_now_add=True)
def __str__(self):
return ''.join([self.phrase_en[:30], '...'])
And here is my not finished admin.py
from django.utils.translation import get_language
class PhilosophyAllPhrases(admin.ModelAdmin):
model = Phrases
actions_on_bottom = True
actions_on_top = True
actions_selection_counter = True
date_hierarchy = 'pub_date'
lang = get_language()
fieldsets = [
(
'English', {
'fields': ['phrase_en'],
'classes': ['collapses']
}
), (
'Russian', {
'fields': ['phrase_ru'],
'classes': ['collapses']
}
), (
'Ukraine', {
'fields': ['phrase_ua'],
'classes': ['collapses']
}
), (
'Settings', {
'fields': ['author', 'phrase_status']
}
)
]
list_display = ('phrase_content', 'phrase_author', 'phrase_status')
def phrase_author(self, obj):
self.lang = get_language()
if self.lang == 'ru':
author = obj.author.name_ru
elif self.lang == 'ua':
author = obj.author.name_ua
else:
author = obj.author.name_en
return format_html('<span class="pp_author">%s</span>' % author)
def phrase_content(self, obj):
self.lang = get_language()
if self.lang == 'ru':
phrase = obj.phrase_ru
elif self.lang == 'ua':
phrase = obj.phrase_ua
else:
phrase = obj.phrase_en
return format_html(('%s...' % phrase[:100]).upper())
So the method get_language() is working properly in the phrase_author(), and phrase_content(). I need to change fieldsets and phrase_author.admin_order_field depending on user language but it returns the default 'en-us', not current.
May be I must to use another method? Or what I'm doing wrong?
For example I want to do like this:
lang = get_language()
if lang == 'ru':
phrase = (
'Фраза', {
'fields': ['phrase_ru'],
'classes': ['collapses']
}
)
elif lang == 'en':
phrase = (
'Phrase', {
'fields': ['phrase_en'],
'classes': ['collapses']
}
)
settings = (
'Settings', {
'fields': ['author', 'phrase_status']
}
)
fieldsets = [phrase, settings]
See the code below:
from django.utils.translation import get_language_from_request
class RecordAdmin(admin.ModelAdmin):
def changelist_view(self, request, extra_context=None):
self.lng_id = get_language_from_request(request)
return super(RecordAdmin, self).changelist_view(request, extra_context=extra_context)

Return only one field in JSON data

I want to return only the clandpin fields. I have this model below:
model.py
class ButuanMaps(gismodel.Model):
class Meta:
verbose_name = u'Butuan Map'
verbose_name_plural = u'Butuan Maps'
clandpin = gismodel.CharField("Land PIN", max_length=50, null=True, blank=True)
ssectionid = gismodel.ForeignKey(Section)
#ssectionid_id = gismodel.IntegerField()
geom = gismodel.MultiPolygonField("Geom ID", srid=32651, null=True, blank=True)
objects = gismodel.GeoManager()
def __unicode__(self):
return self.clandpin
In my template, here's the code for AJAX:
<script type="text/javascript">
$(document).ready(function() {
$("#formsection").change(function() {
$.ajax({
url : "/sectionpins",
type : "GET",
dataType: "html",
data : {
'sectionid' : $('#formsection').val(),
'csrfmiddlewaretoken' : $("input[name=csrfmiddlewaretoken]").val()
},
success : searchSuccess,
error: errs
});
return false;
});
});
function searchSuccess(data){
alert("Success");
$('#forminput').append(
"<option value='"+data+"'>"+data+"</option>"
);
}
function errs(){
alert('Error!!!!');
}
</script>
In views.py:
def section_landpins(request):
if request.method == "GET":
m = ButuanMaps.objects.filter(ssectionid=request.GET['sectionid'])
landpins = serializers.serialize("json", m.values('clandpin'), fields=("clandpin"))
data = json.dumps({
'pins': landpins,
})
return HttpResponse(data, content_type='application/json')
It returned an error
AttributeError at /sectionpins'dict' object has no attribute '_meta'
When I changed the query with this:
m = ButuanMaps.objects.filter(ssectionid=request.GET['sectionid'])
It doesn't return an error but this:
{"pins": "[{\"pk\": 185625, \"model\": \"tbl.butuanmaps\", \"fields\": {\"clandpin\": \"162-12-0001-055-37\"}}
You can do this by requesting only the field you are interested in from the ORM, then evaluating the ValueQuerySet into a list of dictionaries:
section_id = request.GET.get('sectionid', 'defaultid')
m = ButuanMaps.objects.filter(ssectionid=section_id).values('landpins')
return HttpResponse(json.dumps({'pins': list(m)}),
content_type='application/json')

Categories